如何使类别与多个模型建立关系?

时间:2014-03-15 11:35:33

标签: ruby-on-rails

我有下一个模型:文章,公告,目录和媒体。

对于每个模型的项目,我需要创建一个子类别和一个类别。我计划创建一个包含两列的关系表:parend_idchild_id,以及包含category_id的每个模型的列。

我应该创建多少关系模型?

  • 一个人一个人?
  • 每个模型的一个关系模型?

2 个答案:

答案 0 :(得分:0)

无需创建关系模型,只需使用belongs_to关系

因为你说跟随我认为belongs_to关系应该这样做

  

对于每个模型的项目,我需要创建子类别和类别。

只需在表格中添加subcategory_idcategory_id:文章,公告,目录和媒体,并建立has_many belongs_to关系

编辑但是如果你坚持使用关系模型,那么我建议为每个模型使用一个关系模型。

最后编辑:我真的认为你应该使用belongs_to,has_many relation

Class Article < ActiveRecord::Base
    belongs_to :category
    belongs_to :subcategory
end

class Category < ActiveRecord::Base
  has_many :articles
  # the same relation(has_many) will be for Announcements, Catalogs and Media

  has_many :subcategories
end

class Subcategory < ActiveRecord::Base
  has_many :articles

  belongs_to :category
end

通过这种方式,您可以使用category.subcategories.articles

获取所有文章

如果category只有一个Subcategory,则将它们之间的关系更改为has_one,语法将变为category.subcategory.articles

答案 1 :(得分:0)

我个人会在单个连接表中使用has_many :through关系与多态关联:

#app/models/article.rb
Class Article < ActiveRecord::Base
    has_many :categorizable_categories
    has_many :categories, through: :categorizable_categories
end

class Article < ActiveRecord::Base
  has_many :tags, as: :taggable,dependent: :destroy
  has_many :categories, through: :tags
end
class Category < ActiveRecord::Base
  has_many :tags, dependent: :destroy
  has_many :articles, through: :tags, source: :taggable, source_type: 'Article'
end
class Tag < ActiveRecord::Base
  belongs_to :taggable, polymorphic: true
  belongs_to :category
end

这样您就可以使用@article.categories

等类型调用每个模型的类别

实现父母与父母的关系子类别,我建议使用像Ancestry gem这样的东西 - 你在连接表中设置一个祖先列 - 基本上允许你直接在模型的类别之间建立关系