在我的应用中,我有以下模型:List
,Item
和Category
。
每个项belong_to
一个列表。
每个项目belongs_to
都是一个类别。
每个项目列表还需要以某种方式与多个类别相关联。这意味着如果用户创建了一个类别,它将分配list_id
,等于用户在创建类别时正在处理的列表的id
。这样当用户决定摆脱列表时,我也可以摆脱为该列表创建的所有自定义类别。问题是我还想要一些“默认”类别:可用于所有列表的类别。我不确定如何建模lists
和categories
之间的关系。 belongs_to
对我不起作用,因为“默认”类别并不属于任何特定列表,它们属于所有列表。
我非常感谢有关如何处理这种关系的任何建议!
答案 0 :(得分:0)
has_many
- Category
关系的双方肯定需要List
关系。
您可以在类别模型中将类别名称作为“默认值”保留在常量中,或者类别可以具有布尔属性,以便您知道是否删除它。
要删除列表时删除类别,您可能需要编写一个自定义方法,该方法可以作为List模型上的after_destroy
回调运行。
答案 1 :(得分: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
这将创建第三个表来跟踪所有模型之间的关系。 Ryan Bates在这个问题上有一个很棒的railscast你应该看看。
然后dependent: :destroy
将确保如果删除了一个关系,那么为了确保从该列表中删除其他类别,您可以使用before_destroy或after_destroy方法。