Deep associations in rails activerecord
May 22nd, 2010
Some time ago I wrote about complex associations, now time to add another method and corrections.
First the finder_by_sql, in that particular case It was necessary to add
:readonly => true
So the code looks now like this:
has_many :roles,
:readonly => true,
:finder_sql => '
SELECT roles.name FROM roles
INNER JOIN responsibilities ON roles.id = responsibilities.role_id
INNER JOIN assigments ON responsibilities.group_id = assigments.group_id
WHERE assigments.user_id = #{id}
GROUP BY roles.id
'
There is one realy big downside of using finder_sql – it does not work with find_by_… or named scopes, so this forced me to continue searching and this is the result:
def roles
Role.scoped(
{
:joins => { :responsibilities => { :group => { :assigments => :user } } },
:conditions => {"users.id" => id},
:group => "roles.id"
}
)
end
and now I can write:
user.roles.by_name(:admin).count
where by_name is an named scope
named_scope :by_name, lambda { |type| {:conditions => [ "roles.name = ", type.to_s ] } }


