【问题标题】:How to reduce number of identical queries when retrieving records in model检索模型中的记录时如何减少相同查询的数量
【发布时间】:2016-07-11 00:39:42
【问题描述】:

我已经开始使用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

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


更新:

根据 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 来检查这些星星是否属于帖子。对吧?

【问题讨论】:

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


    【解决方案1】:

    您可以通过使用关联来减少这种重复查询——它们会被 Rails 自动缓存。

    class Post
       has_many :stars
    
    
    class User
       def has_starred_post?(post)
         return false if post.nil?
    
         post.stars.exists?
       end
    

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

    【讨论】:

    • 您好,Taryn 感谢您的回复。我已根据您的反馈更新了我的问题,但如果您有时间,我还有一个问题。谢谢!
    • @JodyHeavener 一旦收到答案,就不能考虑改变问题。
    • 但问题是一样的吗?
    • @JodyHeavener - 你上面的例子看起来应该可以工作。
    猜你喜欢
    • 2017-01-12
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多