加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – mongoid – using包含以1..N引用的关系选择子

发布时间:2020-12-17 03:30:19 所属栏目:百科 来源:网络整理
导读:我有这样的场景: blog.posts 每个帖子属于另一个对象,比如Tag(在belongs_to,has_many关系中),所以我可以这样做: tag.posts 为了防止N 1问题,我希望能够做blog.posts,但也抓住每个帖子关联的每个标签,以便生成两个查询,一个用于帖子,一个用于所有标签(基于
我有这样的场景:

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

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

干杯.

解决方法

您可以使用范围来实现此目的,特定的默认范围.因此,在Post模型中,您可以定义模型:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读