我无法理解为什么在这种情况下会生成两个重复的sql查询:
我有一个has_many :comments
post = Post.where(id: 4).includes(:comments).first
生成这些sql语句:
SELECT "posts".* FROM "posts" WHERE "posts"."id" = 4 LIMIT 1
SELECT "comments".* FROM "comments" WHERE "comments"."post_id" IN (4)
现在:
comment = post.comments.first
(没有sql - 好)
但是:
post = comment.post
生成相同的sql:
SELECT "posts".* FROM "posts" WHERE "posts"."id" = 4 LIMIT 1
似乎对象内部没有绑定。我有办法手动避免第二个sql吗?
答案 0 :(得分:3)
使用inverse_of
指定双向关系。来自the docs:
在关联上指定:inverse_of选项可让您告诉Active Record有关反向关系的信息,它将优化对象加载。
对于简单的情况,它可能看起来多余,但是关联是单向定义。指定inverse_of
让Rails知道这两个关系是彼此相反的,并解决了你所拥有的问题。
# in post.rb
has_many :comments, :inverse_of => :post
# in comment.rb
belongs_to :post, :inverse_of => :comments