0

我有一组如下所示的模型(此处显示的实际设置是一个简化的模型):

Blog 
has_many :posts

Post
has_many :comments
# contributor_id is a part of Post

Contributor
# having fields such as :id, :name, etc. 

我像这样遍历它们:

Blog.all.includes(:posts => :contributors).each do |blog|
render partial: 'blog_item', :locals => { :blog => blog } 
end

在' blog_item'部分视图中,我想确定特定的贡献者(id:123,名称:“john”)是否包含在posts. 作为一个一般问题,这很容易,但我想在没有 SQL 调用的情况下执行此操作(导致 N+1)。

目前,我正在解决这个问题:

blog.posts.pluck(:contributor_id).include?(123)

这会导致 SQL 调用(以及随后的 N+1)。

我不能做这样的事情:

blog.posts.include?(:contributor_id) 

那么,如何在没有额外的 SQL 调用的情况下解决这个问题呢?

4

1 回答 1

0

很长一段时间以来,我一直在尝试解决这个问题。发布问题,之后直接阅读文章的小节并在2分钟内解决。

@contributor = Contributor.find(123)
Blog.all.includes(:posts => :contributors).each do |blog|
  render partial: 'blog_item', :locals => { :blog => blog } 
end

# Inside blog_item
blog.posts.map(&:contributor).include?(@contributor)
于 2021-04-14T06:12:35.553 回答