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 ] } }