Getting a little closer…
class Image < ActiveRecord::Base
acts_as_authorizable
named_scope :governed_by, lambda {|*args| user, role = args
if !role.blank?
conditions = ['roles_users.user_id = ? AND
roles.id = ?', user,
role] if role.is_a? Role
conditions = ['roles_users.user_id = ? AND
roles.name = ?',
user, role] if role.is_a? String
else
conditions = ['roles_users.user_id = ?', user]
end
{:include => :accepted_roles, :joins => 'LEFT OUTER JOIN
roles_users ON `roles`.id = role_id', :conditions => conditions}
}
end
class User < ActiveRecord::Base
def images; Image.governed_by(self); end
def owned_images; Image.governed_by(self, 'owner'); end
def favorite_images; Image.governed_by(self, 'fan'); end
end
>> u.images # Returns an array of images for which the user "u" has any role at all
>> u.owned_images # Returns an array of images for which the user "u" has the 'owner' role
>> u.favorite_images # Returns an array of images for which the user "u" has the 'fan' role
>> u.favorite_images.find_by_medium('photography') # Ouch! Not so association proxy-y!
ActiveRecord::StatementInvalid: Mysql::Error: Unknown column
'
roles.id' in 'on clause': SELECT DISTINCT `images`.id FROM `images`
LEFT OUTER JOIN roles_users ON `roles`.id = role_id WHERE
(`images`.`medium` = 'photography') AND (roles_users.user_id = 1)
LIMIT 1