Comment déterminer si Rails Association est très chargé?

Est-ce que quelqu’un connaît un moyen de déterminer si une association Rails a été chargée avec impatience?

Ma situation: J’ai un ensemble de résultats où parfois une des associations est chargée avec impatience, et parfois ce n’est pas le cas. Si ce n’est pas le cas, je souhaite rechercher des associations à l’aide de la recherche d’ActiveRecord. S’il est chargé, je veux utiliser la détection.

Par exemple, disons que j’ai un tableau “has_many” d’objects shipping_info dans mon modèle d’élément. Alors:

Si l’article est chargé rapidement, la charge la plus efficace est:

item.shipping_infos.detect { |si| si.region == "United States" } 

Si l’article n’est pas chargé, la charge la plus efficace est:

 item.shipping_infos.where(region: "United States").first 

Mais à moins que je sache si elle est chargée, je ne sais pas quel code appeler pour obtenir le document efficacement. Si j’utilise la première méthode quand elle n’est pas chargée, je dois rechercher plus d’enregistrements de firebase database que nécessaire. Et si j’utilise la seconde méthode lorsqu’elle est chargée avec impatience, mes objects chargés avec impatience sont ignorés.

item.shipping_infos.loaded? vous dira

Je dois dire, cependant: ce chemin mène à la folie… avant d’écrire du code que les tests ont loaded? pour décider entre #detect et #find , assurez-vous que cette instance compte vraiment , par rapport à tout ce qui se passe.

Si ce n’est pas la chose la plus lente de votre application, l’ajout de chemins de code supplémentaires ajoute une complexité inutile. Le simple fait de gaspiller un petit effort de firebase database ne signifie pas nécessairement que vous devez le réparer – cela n’a probablement pas d’importance.

loaded_foo? est obsolète depuis Rails 3.1. Voir: https://github.com/rails/rails/issues/472 utilisez l’ association(name).loaded? au lieu.

Je suggère d’utiliser item.association_cache.keys qui fournira une liste des associations chargées avec impatience. Donc, vous item.association_cache.keys.include? : name_of_association

Vous pouvez détecter si une seule association a été chargée avec loaded_ foo ?. Par exemple, si shipping_info était une association amie_à, alors item.loaded_shipping_info? va retourner vrai quand il a été chargé avec impatience. Bizarrement, il semble renvoyer zéro (plutôt que faux) quand il n’a pas été chargé (dans Rails 2.3.10 de toute façon).

La solution à ce problème devrait être foo.association(:bla).loaded? , MAIS cela fonctionne incorrectement – il vérifie et marque l’association comme sale:

 class Foo; has_one :bla, :autosave => true end foo.association(:bla).loaded? #=> false foo.save # saves foo and fires select * from bla 

J’ai donc ajouté l’extension suivante à ActiveRecord:

 module ActiveRecord class Base def association_loaded?(name) association_instance_get(name).present? end end end 

et maintenant:

 class Foo; has_one :bla, :autosave => true end foo.association_loaded?(:bla) #=> false foo.save # saves foo 

Jetez un oeil à la gemme Bullet. . Cela vous dira quand vous devriez et ne devriez pas utiliser un chargement enthousiaste.

association_cached? pourrait être un bon ajustement:

 item.association_cached?(:shipping_infos)