0

query-analyzerの使用を開始しましたが、同一のクエリについて警告されています。

コンテキストとして、ページに 25 個の「投稿」を読み込んでおり、現在のユーザーは投稿に「スター」を付けることができます。

0.018 秒25 個の同一クエリ SELECT SQL_NO_CACHE N AS one FROM 'stars' WHERE 'stars'.'post_id' = N AND 'stars'.'user_id' = N LIMIT N

これは User モデルのメソッドです。

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、それらの星のいずれかが投稿に属するかどうかを確認するために使用する必要があります。右?

4

1 に答える 1

1

Rails によって自動的にキャッシュされる関連付けを使用すると、この種の重複するクエリを減らすことができます。

class Post
   has_many :stars


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

     post.stars.exists?
   end

または、実際のオブジェクトモデルにとって意味のあるように再編成します...

于 2016-07-11T00:49:39.567 に答える