Rails:has_and_belongs_to_many带有“主”记录

时间:2015-01-17 23:07:20

标签: ruby-on-rails activerecord rails-activerecord

我必须建模:UserPost。每个用户都可以" pin" (添加到他的页面)任何帖子,因此user.posts应该返回所有已添加的帖子,而post.users应该返回所有帖子。

此外,用户应该能够创建帖子,因此每个帖子都有一个创建者(" master" user),因此post.user应该返回此主用户(帖子总是" pined& #34;对于主用户而言。)

我的想法是使用像

这样的迁移
create_table :posts_users do |t|
  t.references :post, null: false, index: true
  t.references :user, null: false, index: true
  t.boolean :master, null: false, default: false
end

但我应该如何在模型中指定关联?

1 个答案:

答案 0 :(得分:1)

has_and_belongs_to_many方法实际上只是定义has_many through关系的快捷方式,并且它不适合在中间连接表中存储任何其他数据。将posts_users重命名为pins后,我认为它可以像这样工作:

class User < ActiveRecord::Base
  has_many :pins
  has_many :posts, through: :pins

  has_many :master_posts, -> {where pins: {master: true}},
    class_name: "Post", through: :pins, source: :post
end

class Pin < ActiveRecord::Base
  belongs_to :post
  belongs_to :user
end

class Post < ActiveRecord::Base
  has_many :pins
  has_many :users, through: :pins

  def user
    users.where(pins: {master: true}).first
  end
end

总的来说,它几乎是您在几乎所有应用中都会遇到的标准has_many :through association。有趣的部分是master_posts关联。您可以查看documentation中已通过的选项(请参阅底部的Options部分)。

bob = User.create! name: "Bob"

bob.posts.create! title: "Title 1"
bob.posts.create! title: "Title 2"

bob.posts.pluck :title
# => ["Title 1", "Title 2"]

bob.master_posts.create! title: "Title 3"
bob.master_posts.create! title: "Title 4"

bob.master_posts.pluck :title
# => ["Title 3", "Title 4"]

bob.master_posts.last.user == bob
# => true