5

我有这样的场景:

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

默认情况下执行上述操作。

干杯。

4

1 回答 1

7

您可以使用范围来实现这一点,特别是默认范围。所以在你的 Post 模型中,你可以这样定义你的模型:

class Post
   belongs_to :tag
   default_scope includes(:tag)
end

这样,每当您执行查询以获取帖子时,例如 Blog.posts,mongoid 也会生成一个查询以获取与每个帖子关联的所有标签。

于 2012-05-04T16:42:18.967 回答