Bonjour à tous,
J'ai une question qui concerne le requêtage avec Arel, et plus
précisément sur la façon dont fonctionnent les intersections.
Prenons la modélisation suivante : un client (customer) possède
plusieurs comptes bancaires (accounts), et il est possible de réaliser
des virements (transfers) entre des comptes du même client. Un
virement est alors constitué d'un compte source et d'un compte cible.
Si je veux obtenir tous les virements d'un client donné, je peux
écrire la requête suivante dans la classe Customer :
transfers = Transfer.joins(:source) & Account.where(:customer_id =>
id)
Aucun problème, ça marche impeccable. Cependant, dans ma quête sans
fin de plus de concision, je me dis que, au niveau de l'objet
Customer, "Account.where(:customer_id => id)" et "accounts"
représentent exactement la même chose : les comptes du client. Je
pourrais donc écrire plus simplement :
transfers = Transfer.joins(:source) & accounts
Mais là, aucun résultat (sans provoquer d'erreur cependant).
L'un d'entre-vous aurait une explication à me donner ? Est-ce que je
suis pas en train de me mélanger les pinceaux entre les prédicats Arel
et les associations ActiveRecord ? Si oui, pourquoi n'y a-t-il pas
d'erreur à l'exécution ?
Merci :)
Philippe
Voici les modèles en détails :
[models/customer.rb]
class Customer < ActiveRecord::Base
has_many :accounts, :dependent => :destroy
def transfers
# Useless to join the targets, since both source and target
necessarily belong to this customer
# Why this doesn't work ? Transfer.joins(:source) & accounts
Transfer.joins(:source) & Account.where(:customer_id => id)
end
end
[models/account.rb]
class Account < ActiveRecord::Base
belongs_to :customer
end
[models/transfer.rb]
class Transfer < ActiveRecord::Base
belongs_to :source, :class_name => "Account"
belongs_to :target, :class_name => "Account"
end
Environnement : Rails 3.0.4 / Ruby 1.9.2
PS : À demain les nantais pour l'apéror ;-)
--
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de
Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse
[email protected]
Pour résilier votre abonnement envoyez un e-mail à l'adresse
[email protected]