如何在Rails中建立多对多关系

时间:2019-01-29 19:32:41

标签: ruby-on-rails activerecord

所以我目前在一个应用中:

class Post < ApplicationRecord
 belongs_to :category
end

class Category < ApplicationRecord
    has_many :posts
end

可以正常工作。但是,我需要在帖子中添加多个类别。我曾考虑过对每个人使用has_many_and_belongs_to来获取此信息,但在实现此功能时会遇到一些麻烦。似乎需要添加联接表?如果是这样,上面显示的设置将如何?

有什么想法吗?

我非常感谢您的投入!预先感谢!

2 个答案:

答案 0 :(得分:2)

该表应命名为categories_postscategories由于字母顺序而排在最前面),并且包含post_idcategory_id整数列(最有可能是索引的)。就像这样简单:

class Post < ApplicationRecord
  has_and_belongs_to_many :categories
end

class Category < ApplicationRecord
  has_and_belongs_to_many :posts
end

您可以使用以下方法创建添加迁移的联接表:

rails g migration CreateJoinTableCategoryPost category post

答案 1 :(得分:1)

或者,您可以使用has_many :through来更好地控制联接表。

对多对多关系使用:through的优势

  • 通过has_many :through关系,您可以拥有一个模型,该模型将允许您添加验证和回调。
  • 如果您最初花了一些额外的精力来建立多对多关系,则可以节省很多时间和将来的麻烦
  • 如果将来您想在联接表上保存更多信息(如一些自定义排序),则将如何使用has_and_belongs_to_many来限制表的关联信息

示例

class Post < ApplicationRecord
  has_many :categories, through: :post_categories
  has_many :post_categories   
end

class Category < ApplicationRecord
  has_many :posts, through: :post_categories
  has_many :post_categories   
end

使用rails generator命令添加关系模型

rails g model post_category category_id:integer post_id:integer custom:text 

class PostCategory < ApplicationRecord
  belongs_to :category
  belongs_to :post
end