即使使用includes,Rails也会复制sql查询

时间:2013-03-24 23:00:14

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

我无法理解为什么在这种情况下会生成两个重复的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吗?

1 个答案:

答案 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