2010-07-14 6 views
1

Je ne sais pas ce qui pourrait tomber dans la section de la performance ainsi que la section modèle/base de données, va ici ....chargement Désireuse pour les associations polymorphes

Disons que j'ai 3 modèles:

Movie { 
has_one :interest, :as => :resource 
} 
Song { 
has_one :interest, :as => :resource 
} 
Story { 
has_one :interest, :as => :resource 
} 

et ...

Interest { 
belongs_to :resource, :polymorphic => true 
} 

maintenant, si je besoin d'une liste de tous les intérêts de tous les films, et je veux montrer aussi la date à laquelle ces objets films ont été créés (pour dire à quel âge ils étaient), puis-je utiliser la recherche sur resource_typ Attribut, puis @ some_interest.resource.created_at. Le problème avec ceci est que si j'ai 100 intérêts de film, alors j'obtiendrai 101 requêtes non? Donc dégradation linéaire. J'ai essayé d'utiliser: include => [: resource] dans mon appel de requête, mais il dit ne peut pas utiliser inclure dans les associations polymorphes.

Comment puis-je soit charger ardemment ou optimiser ce problème pour éviter cette grave dégradation?

Toute aide serait grandement appréciée !!

+0

Je pense que cela répondra à votre question: http://stackoverflow.com/questions/2390017/ruby-on-rails-include-on-a-polymorphic-association-with-submodels –

Répondre

0

Si vous utilisez searchlogic, il existe une syntaxe spéciale pour gérer les relations polymorphes qui peuvent aider. Vous pouvez effectuer une recherche sur le côté has de la relation en spécifiant le nom de la classe associée avec le suffixe type.

E.g. compte tenu de vos modèles, vous devriez être en mesure de faire quelque chose comme ça pour obtenir des films créés dans les 90 derniers jours:

Interest.resource_movie_type_created_at_gt(Time.now-90.days)

Searchlogic met en place la jointure du modèle associé pour vous, ce qui devrait apaiser les inquiétudes de performance .

Bien sûr, vous pouvez toujours écrire votre propre SQL en utilisant la méthode find_by_sql.

PS. une astuce très utile est de turn on logging in the Rails console lors de l'écriture de recherches. Cela vous permet de voir le code SQL généré directement dans la console sans avoir à parcourir les journaux.

Questions connexes