使用 where 条件

问题描述

我有下表结构。这只是一个例子

UserPost => user_id,post_id,Post,Comment

因此,如果我尝试使用以下查询获取所有 user_posts 并在 comments 表上执行 where ,则它会触发对 comments 表的查询

user_posts = UserPost.includes(post: :comments)
user_posts.each do |up|
  post = up.post # No Query
  comments = up.comments # No query
  comments_with_condition = up.comments.where(visibility: true).order(position: :asc).first.data # Fires query for .where and .order as well.
end

那么,这是预期的行为还是我做错了什么?

如何防止每个user_post查询

解决方法

您可以做的是将另一个 has_many 添加到您的模型中,并带有您想要的过滤器。

# You can name this anything you want but a descriptive name helps
has_many :special_comments,-> { where(visibility: true).order(..) },class_name: 'Comment'

...并在您的查询中预先加载它,这将预先加载两种类型的评论。这将不可避免地导致一个额外的查询,但它不是 N+1。

user_post = UserPost.includes(post: [:comments,:special_comments])

user_posts.each do |user_post|
  post = user_post.post
  comments = user_post.comments
  comments_with_condition = user_post.special_comments
end