如何在 Rails / ActiveRecord 中设置此 belongs_to 关联?
How to set up this belongs_to association in Rails / ActiveRecord?
我有 User
和 Review
型号。评论可以有 author
和 subject
,两者都指向 User
:
class Review < ApplicationRecord
belongs_to :subject, class_name: 'User', optional: true
belongs_to :author, class_name: 'User', optional: true
end
class CreateReviews < ActiveRecord::Migration[5.0]
def change
create_table :reviews do |t|
t.references :subject
t.references :author
end
end
end
这很好用,现在我可以将两个单独的 User
对象分配给 Review
对象,以表示谁针对谁撰写了评论。
但是,用户并不知道 "know" 他作为主题或作者与多少评论相关联。我在评论中添加了 has_and_belongs_to_many :users
,反之亦然,虽然可行,但并不是我想要的。
如何设置关联才能执行以下操作:
review.author = some_other_user
review.subject = user2
another_review.author = some_other_user
another_review.subject = user2
user2.a_subject_in.count
#=> 2
user2.a_subject_in
#=> [#<Review>, #<Review>]
some_other_user.an_author_in.count
#=> 2
换句话说,我如何查看 User
被保存为作者或主题的次数 belongs_to
?
我想你正在寻找这个查询:
class User
def referenced_in
# this fetches you all the reviews that a user was referenced
Review.where("reviews.author_id = :user_id OR reviews.subject_id = :user_id", user_id: id).distinct
end
end
User.first.referenced_in #should give you all records a user was referenced
如果你想在用户端使用has_many
关联,你需要定义两个单独的has_many
关系,如
class User < ApplicationRecord
has_many :reviews, foreign_key: :author_id
has_many :subject_reviews, class_name: 'Review', foreign_key: :subject_id
end
现在你可以简单地使用
irb(main):033:0> s.reviews
Review Load (0.2ms) SELECT "reviews".* FROM "reviews" WHERE "reviews"."author_id" = ? [["author_id", 1]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Review id: 1, comment: "random", subject_id: 2, author_id: 1, created_at: "2016-07-12 01:16:23", updated_at: "2016-07-12 01:16:23">]>
irb(main):034:0> s.subject_reviews
Review Load (0.2ms) SELECT "reviews".* FROM "reviews" WHERE "reviews"."subject_id" = ? [["subject_id", 1]]
=> #<ActiveRecord::Associations::CollectionProxy []>
评论:subject_reviews这个名字不好:),改成你的要求。
我有 User
和 Review
型号。评论可以有 author
和 subject
,两者都指向 User
:
class Review < ApplicationRecord
belongs_to :subject, class_name: 'User', optional: true
belongs_to :author, class_name: 'User', optional: true
end
class CreateReviews < ActiveRecord::Migration[5.0]
def change
create_table :reviews do |t|
t.references :subject
t.references :author
end
end
end
这很好用,现在我可以将两个单独的 User
对象分配给 Review
对象,以表示谁针对谁撰写了评论。
但是,用户并不知道 "know" 他作为主题或作者与多少评论相关联。我在评论中添加了 has_and_belongs_to_many :users
,反之亦然,虽然可行,但并不是我想要的。
如何设置关联才能执行以下操作:
review.author = some_other_user
review.subject = user2
another_review.author = some_other_user
another_review.subject = user2
user2.a_subject_in.count
#=> 2
user2.a_subject_in
#=> [#<Review>, #<Review>]
some_other_user.an_author_in.count
#=> 2
换句话说,我如何查看 User
被保存为作者或主题的次数 belongs_to
?
我想你正在寻找这个查询:
class User
def referenced_in
# this fetches you all the reviews that a user was referenced
Review.where("reviews.author_id = :user_id OR reviews.subject_id = :user_id", user_id: id).distinct
end
end
User.first.referenced_in #should give you all records a user was referenced
如果你想在用户端使用has_many
关联,你需要定义两个单独的has_many
关系,如
class User < ApplicationRecord
has_many :reviews, foreign_key: :author_id
has_many :subject_reviews, class_name: 'Review', foreign_key: :subject_id
end
现在你可以简单地使用
irb(main):033:0> s.reviews
Review Load (0.2ms) SELECT "reviews".* FROM "reviews" WHERE "reviews"."author_id" = ? [["author_id", 1]]
=> #<ActiveRecord::Associations::CollectionProxy [#<Review id: 1, comment: "random", subject_id: 2, author_id: 1, created_at: "2016-07-12 01:16:23", updated_at: "2016-07-12 01:16:23">]>
irb(main):034:0> s.subject_reviews
Review Load (0.2ms) SELECT "reviews".* FROM "reviews" WHERE "reviews"."subject_id" = ? [["subject_id", 1]]
=> #<ActiveRecord::Associations::CollectionProxy []>
评论:subject_reviews这个名字不好:),改成你的要求。