J'ai regardé par-dessus les sources d'arelle et certaines des sources Activerecord pour Rails 3.0, mais je ne peux pas sembler glaner une bonne réponse pour moi-même que Arel changera notre capacité à utiliser inclut (), Lors de la construction de requêtes, pour le mieux.
Il y a des cas où on pourrait vouloir modifier les conditions d'un activeCord: inclure la requête en 2.3.5 et avant, pour les enregistrements d'association qui seraient renvoyés. Mais autant que je sache, cela n'est pas programmatiquement tenable pour tous: Inclure les requêtes: P>
(Je sais qu'une partie AR-Trouver-inclut make t # {n} .c # {m} renorme pour tous les attributs et on pourrait éventuellement ajouter des conditions à ces requêtes pour limiter les résultats des ensembles joints; mais d'autres ne sont pas n_joins + 1 nombre de requêtes sur l'identifiant définit itérativement et je ne sais pas comment on pourrait pirater AR pour modifier ces requêtes itératées. ) p>
Arel nous permettra de construire des requêtes ActiveRecord qui spécifient les objets de modèle associés résultants lors de l'utilisation de l'utilisateur ()? P>
EX: P>
User :has_many posts( has_many :comments) User.all(:include => :posts) #say I wanted the post objects to have their #comment counts loaded without adding a comment_count column to `posts`. #At the post level, one could do so by: posts_with_counts = Post.all(:select => 'posts.*, count(comments.id) as comment_count', :joins => 'left outer join comments on comments.post_id = posts.id', :group_by => 'posts.id') #i believe #But it seems impossible to do so while linking these post objects to each #user as well, without running User.all() and then zippering the objects into #some other collection (ugly) #OR running posts.group_by(&:user) (even uglier, with the n user queries)
3 Réponses :
Pourquoi n'utilisez-vous pas réellement arel à son noyau. Une fois que vous êtes descendu à la périmètre de la table, vous pouvez utiliser Arel :: Relation qui est complètement différente de l'implémentation de ActionCord. Je crois vraiment que l'ActionCord :: La relation est une implémentation complètement différente (et cédée) d'une enveloppe autour d'une arelle :: Relation & Arel :: Tableau. J'ai choisi d'utiliser Arel à son noyau en faisant quoi que ce soit.Coped.Table (Arel :: Table) qui est le style d'enregistrement actif ou Arel :: Table.New (: Nom de table) qui me donne une arelle fraîche :: Table (My méthode préférée). De là, vous pouvez faire ce qui suit.
posts = Arel::Table.new(:thing, :as => 'p') #derived relation comments = Arel::Table.new(:comments, :as => 'c') # derived relation posts_and_comments = posts.join(comments).on( posts[:id].eq(:comments[:id]) ) # now you can iterate through the derived relation by doing the following posts_and_comments.each {...} # this will actually return Arel::Rows which is another story. #
Merci d'avoir mentionné ActiveRecord :: Relation. Ce commentaire m'a conduit ici: Metautonomo.us/2010/05/11 / ActiveRecord-Relation-vs-Arel qui me rapproche d'un pas de plus de comprendre le système d'emballage.
"Pourquoi n'utilisez-vous pas réellement arelle à son noyau." Parce que j'aimerais utiliser des formulaires, les concepteurs que je travaille avec peuvent modifier les formulaires comme ils le souhaitent. Je ne suis pas encore prêt à abandonner Activerecord.
Je ne crois pas que cette question; La réponse, je veux dire. Je suis en parfait accord sur lequel utiliser Arel directement est presque obligatoire pour des requêtes plus avancées, mais cela ne fait pas la même chose que l'utilisation de la notice traditionnelle avec ActionLATION, d'après ce que je peux dire.
activeCord :: relation est un wrapper assez faible autour de la base # Find_By_SQL, donc: inclure les requêtes ne sont pas étendues de quelque manière que ce soit par son inclusion. P>
Qui réduit la question à: Stackoverflow.com/Questtions/4908878/...
n'est pas
Post.includes([:author, :comments]).where(['comments.approved = ?', true]).all
Pardon, je ne dois pas avoir été claire. Ce que je demandais, c'est de modifier les membres chargés dans la cible de l'association incluse. Par exemple, pour obtenir un nombre de commentaires pour chaque message sans charger les objets de commentaire de la DB.
Je n'ai pas testé votre exemple, mais je crois que la requête réduirait également l'ensemble des postes à ceux qui avaient un commentaire qui a été marqué approuvé, également.
Faites-moi savoir comment je peux modifier la question pour que tout soit plus évident.
Steven Xu a effectivement demandé à ma question dans sa forme de base.