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