2012-09-21 111 views
0

在我的应用程序中,我有以下型号:List,ItemCategoryRuby on Rails:建模外键关系。

每个项目belong_to的一个列表。 每个项目belongs_to一个类别。

每个项目列表还需要以某种方式与多个类别相关联。这意味着如果用户创建了一个类别,它将有一个list_id分配给它,等于id用户创建类别时正在处理的列表。这样,当用户决定摆脱列表时,我也可以摆脱为该列表创建的所有自定义类别。问题是我还想要一些“默认”类别:可用于所有列表的类别。我不知道如何建模listscategories之间的关系。 belongs_to不适用于我,因为“默认”类别不属于任何特定列表,它们属于所有列表。

我非常感谢任何有关如何处理这种关系的建议!

回答

0

你肯定需要has_many关系,两边Category - List的关系。

您可以将类别名称作为类别模型中常量的“默认值”,或者该类别可以具有布尔属性,以便知道是否删除它。

要在删除列表时删除类别,您可能需要编写一个自定义方法,该方法可以作为List模型中的after_destroy回调运行。

0

您希望为您的类别和列表模型设置多对多关系。要做到这一点,这是你会做什么

class List < ActiveRecord::Base 
    has_many :categorizations, dependent: :destroy 
    has_many :categories, :through => :categorize 
end 

class Categorization < ActiveRecord::Base 
    belongs_to :category 
    belongs_to :list 
end 

class Category < ActiveRecord::Base 
    has_many :categorizations, dependent: :destroy 
    has_many :lists, :through => :categorizations 
end 

class Item < ActiveRecord::Base 
    belongs_to :category 
    belongs_to :list 
end 

这将创建第三个表来跟踪所有的模型之间的关系。瑞恩贝茨在这个问题上有一个很棒的railscast,你应该去看看。

然后dependent: :destroy将确保如果删除一个关系,然后确保其他类别从该列表中删除,您可以使用before_destroy或after_destroy方法。