La prévention de N+1 requêtes dans les Rails
J'ai vu quelques exemples de passer un :include
valeur de hachage lors de l'appel de l'un de ActiveRecord est find
méthodes dans les Rails. Cependant, je n'ai pas vu des exemples de savoir si cela est possible, via la relation de méthodes. Par exemple, disons que j'ai le texte suivant:
def User < ActiveRecord::Base
has_many :user_favorites
has_many :favorites, :through => :user_favorites
end
def Favorite < ActiveRecord::Base
has_many :user_favorites
has_many :users, :through => :user_favorites
end
def UserFavorite < ActiveRecord::Base
belongs_to :user
belongs_to :favorite
end
Tous les exemples que je vois afficher le code comme ceci:
User.find(:all, :include => :favorite)
Mais je ne vois pas d'exemples montrant l'utilisation de relations. Serait-il plutôt être possible pour moi de faire quelque chose comme cela?
User.favorites(:include => :user)
Ces jours-ci, utiliser les puce.
OriginalL'auteur Matt Huggins | 2011-03-27
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas utiliser les relations que les méthodes de la Classe. Il est des méthodes d'instance. Vous pouvez appeler
Découvrez ce screencast sur Désireux de Chargement
http://railscasts.com/episodes/22-eager-loading
Il sera
ou pour Rails 3.x
find
méthode.La réponse est
You can't
C'est trop mauvais, genre défaites certains de la simplicité de Rails. Merci pour l'info.
Non, c'est tout à fait naturel, vous avez juste besoin de le sentir 🙂
Non, je dis que
instance.relationship(:include => ...)
devrait essnentially faire la même chose queClass.find(:all, :include => ...)
, sauf qu'il doit être portée à l'instance. La façon dont il est maintenant, je dois manuellement la portée de la requête lors de l'appel deClass.find
si je veux également profiter de l'utilisation de la:include
option.OriginalL'auteur fl00r
Vous pouvez ajouter
:include
à votre modèle associations désireux de charge de la deuxième ordre associations lorsque l'objet est chargé.http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many
OriginalL'auteur Christopher Manning