Hi,
I’ve been playing with Arel for a few days, but I feel really confused
about predicates / arrays intersection.
Let’s say I have 3 models: users, (bank) accounts and transfers. An
account belongs to a user, and a transfer is made of a source and
target accounts (see the snippets below).
Given a user, I want to query his transfers. I can go this way in the
User class:
def transfers
Transfer.joins(:source) & Account.where(:user_id => id)
end
Here, I intersect the sources accounts of all the transfers with the
user’s accounts. Having said that (as always wanting more and more
conciseness), I wonder why the following is not working:
def transfers
Transfer.joins(:source) & accounts
end
where ‘accounts’ is the user’s accounts dependency.
To me, “Account.where(:user_id => id)” and “accounts” represent
exactly the same concept. Is it because “Account.where(:user_id =>
id)” is a predicate and “accounts” is an Active Record association, so
they aren’t homogeneous?
Actually, “Transfer.joins(:source) & accounts” doesn’t return anything
(there is no error though), while “Transfer.joins(:source) &
Account.where(:user_id => id)” works like a charm.
Can someone clarify this for me?
Thanks in advance for your help
Here are the snippets:
[models/user.rb]
class User < ActiveRecord::Base
has_many :accounts, :dependent => :destroy
def transfers
# Useless to join the targets, since source and target
necessarily belong to this user
# Why this doesn’t work ? Transfer.joins(:source) & accounts
Transfer.joins(:source) & Account.where(:user_id => id)
end
end
[models/account.rb]
class Account < ActiveRecord::Base
belongs_to :user
end
[models/transfer.rb]
class Transfer < ActiveRecord::Base
belongs_to :source, :class_name => “Account”
belongs_to :target, :class_name => “Account”
end
Environment: Rails 3.0.4 / Ruby 1.9.2