10
votes

Rubis Types de collections à Actionecord

Si j'ai un objet avec une collection d'objets enfants à ActiveCord, c'est-à-dire

foo_instance.bars.instance_of?(Array) -> true


0 commentaires

3 Réponses :


9
votes

Je suppose que c'est parce qu'Aciverecord a détourné la méthode de la recherche pour son propre buts. p>

Ce n'est pas vraiment la vraie explication. FOO_Instance.bars Code> ne renvoie pas une instance de tableau, mais une instance de activerecord :: Associations :: AssociationProxie Code>. Il s'agit d'une classe spéciale destinée à servir de proxy entre l'objet qui détient l'association et la associée. P>

L'objet associatiroproxy agit comme une matrice mais ce n'est pas vraiment un tableau. Les informations suivantes sont prises directement à partir de la documentation. P>

foo_instance.bars.all.find { ... }


1 commentaires

Pour clarifier ici, la méthode .all récupère réellement tous les modèles associés qui peuvent avoir un impact énorme de la mémoire en fonction du type d'association. Par exemple, s'il s'agissait d'un utilisateur HAS_MANY: POSTES, vous pourriez récupérer l'historique complet d'un utilisateur qui pourrait constituer une quantité substantielle de données. Dans la mesure du possible, essayez de construire un appel de recherche avec des conditions ou des étanches nommées pour de meilleures performances.



3
votes

Les associations ActiveCord sont en réalité des cas de réflexion, qui remplace l'instance_of? et des méthodes connexes pour mentir sur quelle classe c'est. C'est pourquoi vous pouvez faire des choses comme l'ajout de champs nommés (dire, "récent") puis appeler foo_instance.bars.recent. Si "bars" était un tableau, ce serait assez délicat.

Essayez de vérifier le code source ("localiser les réflexions.rb" doit le suivre sur une case UNIX-ISH). Tchad Fowler a donné une conversation très informative sur ce sujet, mais je ne peux pas sembler trouver des liens sur le Web. (Tout le monde veut éditer ce message pour en inclure?)


0 commentaires

6
votes

Comme d'autres l'ont dit, un objet d'association n'est en réalité pas un tableau. Pour découvrir la classe réelle, faites-le en IRB:

class << foo_instance.bars
  undef find
end
foo_instance.bars.find {...} # Array#find is now called


0 commentaires