Ruby on rails Rails重复sql查询,即使包含

Ruby on rails Rails重复sql查询,即使包含,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我很难理解为什么在这种情况下会生成两个重复的sql查询: 我有一篇帖子有很多评论 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) 现在: (无sql-良好)

我很难理解为什么在这种情况下会生成两个重复的sql查询:

我有一篇帖子
有很多评论

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)
现在:

(无sql-良好)
然而:

生成相同的sql:

SELECT "posts".* FROM "posts" WHERE "posts"."id" = 4 LIMIT 1

这些对象似乎没有内部绑定。是否有一种方法可以手动执行此操作以避免第二个sql?

使用
的反向\u来指定双向关系。发件人:

在关联上指定:inverse_选项可以告诉活动记录反向关系,并优化对象加载

对于简单的情况,它可能看起来是多余的,但关联是单向定义。指定
inverse\u of
可以让Rails知道这两个关系是彼此相反的,并且可以解决像您遇到的问题一样的问题

# in post.rb
has_many :comments, :inverse_of => :post

# in comment.rb
belongs_to :post, :inverse_of => :comments
SELECT "posts".* FROM "posts" WHERE "posts"."id" = 4 LIMIT 1
# in post.rb
has_many :comments, :inverse_of => :post

# in comment.rb
belongs_to :post, :inverse_of => :comments