我有这样的场景:
blog.posts
其中每个帖子属于另一个对象,比如Tag(在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
默认执行上述操作。
干杯。
答案 0 :(得分:7)
您可以使用范围来实现此目的,特定的默认范围。因此,在Post模型中,您可以定义模型:
class Post
belongs_to :tag
default_scope includes(:tag)
end
这样,每当你进行查询以获取帖子时,如Blog.posts,mongoid也会生成一个查询,以获取与每个帖子相关的所有标签。