【问题标题】:Ruby on rails: modeling foreign key relationships.Ruby on rails:建模外键关系。
【发布时间】:2012-09-21 18:30:41
【问题描述】:
在我的应用中,我有以下模型:List、Item 和 Category。
每个项目belong_to 一个列表。
每个项目belongs_to 一个类别。
每个项目列表还需要以某种方式与多个类别相关联。这意味着如果用户创建一个类别,它将有一个list_id 分配给它,它等于创建该类别时用户正在处理的列表的id。这样,当用户决定摆脱列表时,我也可以摆脱为该列表创建的所有自定义类别。问题是我还想要一些“默认”类别:所有列表都可用的类别。我不确定如何模拟lists 和categories 之间的关系。 belongs_to 对我不起作用,因为“默认”类别并不真正属于任何特定列表,它们属于所有列表。
对于如何处理这种关系的任何建议,我将不胜感激!
【问题讨论】:
标签:
ruby-on-rails
model
foreign-key-relationship
【解决方案1】:
Category - List 关系的两边肯定需要has_many 关系。
您可以将作为“默认值”的类别名称保留在类别模型内的常量中,或者该类别可以具有布尔属性,以便您知道是否删除它。
要在删除列表时删除类别,您可能需要编写一个自定义方法,该方法可以在 List 模型上作为 after_destroy 回调运行。
【解决方案2】:
您想为类别和列表模型设置多对多关系。要做到这一点,这就是你要做的
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 方法。