如何在模型中检索记录时减少相同查询的数量

时间:2016-07-11 00:39:43

标签: mysql ruby-on-rails ruby-on-rails-3 query-analyzer

我已经开始使用query-analyzer了,它警告我相同的查询。

对于上下文,我在页面上加载了25个“帖子”,当前用户可以“标记”帖子:

  

0.018s 25个相同的查询 SELECT SQL_NO_CACHE N AS one FROM 'stars' WHERE 'stars'.'post_id' = N AND 'stars'.'user_id' = N LIMIT N

这是用户模型中的方法:

def has_starred_post?(post)
  return false if post.nil?

  Star.where(post_id: post.id, user_id: self.id).exists?
end

如何通过减少查询次数来满足此警告?

更新

Per Taryn East的提示,我将User模型方法更新为:

def has_starred_post?(post)
  return false if post.nil?

  self.stars.where(post_id: post.id).exists?
  # OR post.stars.where(:user_id => self.id).exists?
end

虽然这允许我关联/缓存属于用户的星星,但我仍然必须使用where来检查这些星是否属于帖子。正确?

1 个答案:

答案 0 :(得分:1)

您可以使用关联来减少此类重复查询 - 这些关联由Rails自动缓存。

class Post
   has_many :stars


class User
   def has_starred_post?(post)
     return false if post.nil?

     post.stars.exists?
   end

或重新组织,以便对您的实际对象模型有意义......