我有这样的场景:
blog.posts
其中每个帖子属于另一个对象,例如标签(在 belongs_to,has_many 关系中),所以我可以这样做:
tag.posts
为了防止 N+1 的问题,我希望能够做到 blog.posts,而且还要抓取与每个帖子关联的每个标签,这样就生成了两个查询,一个针对帖子,一个针对所有标签(基于每个属于该帖子的 tag_id)。
我在 mongoid 文档中注意到我可以做到:
Post.includes(:tag).where(:blog_id: blog.id)
这将使我获得属于博客的所有帖子,并获得与帖子关联的每个标签并放入身份映射(前提是已启用)。
问题是,我想做:
blog.posts
并以某种方式重新定义查询以执行我上面想要的操作。有没有办法做到这一点?
目前我正在通过定义一个扩展来缓解这个问题:
has_many :posts do
def with_tags
includes(:tag)
end
end
所以我做
blog.posts.with_tags
但我更喜欢
blog.posts
默认情况下执行上述操作。
干杯。