4

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

4

1 回答 1

3

用于inverse_of指定双向关系。从文档

在关联上指定 :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
于 2013-03-25T04:56:03.860 回答