Ruby on rails:建模外键关系。

时间:2012-09-21 18:30:42

标签: ruby-on-rails model foreign-key-relationship

在我的应用中,我有以下模型:ListItemCategory

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

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

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

2 个答案:

答案 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方法。