2016-07-11 2 views
0

J'ai commencé à utiliser query-analyzer et il m'avertit des requêtes identiques.Comment réduire le nombre de requêtes identiques lors de la récupération d'enregistrements dans le modèle

Pour le contexte, je chargeais 25 "messages" sur la page, et l'utilisateur actuel peut "étoile" un message:

0.018s 25 requêtes identiquesSELECT SQL_NO_CACHE N AS one FROM 'stars' WHERE 'stars'.'post_id' = N AND 'stars'.'user_id' = N LIMIT N

Cette est la méthode dans le modèle de l'utilisateur:

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

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

Comment puis-je satisfaire à cet avertissement en réduisant le nombre de f requêtes?


Mise à jour:

par Taryn pointe de l'Est, je mis à jour la méthode modèle 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 

Bien que cela me permet d'associer/cache les étoiles appartenant à l'utilisateur, je reste doit utiliser where pour vérifier si l'une de ces étoiles appartient à la poste. Droite?

Répondre

1

Vous pouvez réduire ce type de requête en double en utilisant des associations - qui sont automatiquement mises en cache par Rails.

class Post 
    has_many :stars 


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

    post.stars.exists? 
    end 

Ou réorganiser il est donc logique de votre modèle d'objet réel ...

+0

Salut Taryn Merci pour votre réponse. J'ai mis à jour ma question avec vos commentaires, mais j'ai encore une autre question si vous avez le temps. Merci! –

+0

@JodyHeavener une fois qu'une réponse a été reçue, il n'est pas considéré comme sportif de changer la question. – e4c5

+0

Mais la question est la même? –