我必须建模:User
和Post
。每个用户都可以" 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
但我应该如何在模型中指定关联?
答案 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