Question

J'ai un certain nombre de requêtes find_by_sql personnalisés dans Rails. Je voudrais utiliser le chargement avide avec eux, mais il ne semble pas être une bonne façon de le faire.

Je l'ai vu le fichier eager_custom.rb flottant autour et il ne semble pas fonctionner avec Rails maintenant. Il semble Rails fait maintenant différemment le chargement désireux, en utilisant 2 requêtes (la requête régulière en plus d'une requête où le « id IN » ids de la première requête), au lieu de la simple requête de jointure utilisée dans le passé.

Ma question est de savoir si je fais une requête SQL personnalisée, puis faire « id IN » requête, est-il possible de rajouter des objets associés dans les résultats de la requête initiale?

Par exemple, j'ai des sujets chargés de find_by_sql, puis-je trouver des images où le sujet id sujet est dans les sujets ids, est-il possible d'ajouter les images manuellement retour aux sujets?

Merci

Était-ce utile?

La solution

Comme vous l'avez remarqué, dans Rails 2.1 un nouveau genre de hâte / pré-chargement a été introduit qui utilise plusieurs requêtes avec id IN (...). Cette méthode est généralement plus rapide, surtout quand il y a plusieurs associations sont pré-chargées. Vous pouvez utiliser cette fonctionnalité manuellement à l'aide find_by_sql en utilisant la méthode de la classe preload_associations héritée de ActiveRecord (non recommandé). Par exemple:

class Person
  def self.find_a_special_group
    people = find_by_sql("...")
    preload_associations(people, [:jobs, :addresses])
    return people
  end
end

La méthode preload_associations est protégée, vous devez l'appeler à partir de la classe, et il faut (1) un tableau d'objets, (2) un tableau, hachage ou symbole des associations (même format que l'option find de :include) et (3) un hachage d'options. Consultez la documentation de ActiveRecord :: :: AssociationPreload module classmethods pour plus de détails.

Cependant, après avoir dit tout cela, cette technique est certainement indésirable comme la documentation Rails décourage les programmeurs de l'utilisation directement preload_associations. Etes-vous sûr que vous devez utiliser find_by_sql? Êtes-vous sûr de connaître toutes les options find prend? (:select, :from, :joins, :group, :having, etc) Je ne dis pas que vous n'avez pas besoin find_by_sql, mais il vaut peut-être quelques minutes pour vous assurer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top