Searching on a complex attribute in my model


#1

Here is part of my User class:

has_many :permissions
has_many :roles, :through => :permissions

This works very well, and I have a handy convenience method:

def has_role?(name)
self.roles.find_by_name(name) ? true : false
end

However, I’m trying to figure out how to search the RoR way based on the
role and some other criteria. For example, if I want to search for all
users whose first name is Bob and have a role ‘admin’, what would I type
in the conditions part of the query to filter by role? I know that with
a User.find… query, I can no longer use the “self” keyword to call an
instance method.

Thanks for any help…


#2

On Feb 20, 10:03 pm, Naija G. removed_email_address@domain.invalid
wrote:

However, I’m trying to figure out how to search the RoR way based on the
role and some other criteria. For example, if I want to search for all
users whose first name is Bob and have a role ‘admin’, what would I type
in the conditions part of the query to filter by role? I know that with
a User.find… query, I can no longer use the “self” keyword to call an
instance method.

You going to have to use a join so that you can have conditions on
both tables eg

User.find :all, :joins => :roles, :conditions => ["roles.name = ? AND
users.name = ? ", ‘admin’, ‘Bob’]

Or you also do it less verbosely by reversing that: Role.find_by_name
(‘admin’).users.find :all, :conditions => {:name => ‘Bob’}

Fred


#3

Thanks a lot!

Frederick C. wrote:

On Feb 20, 10:03�pm, Naija G. removed_email_address@domain.invalid
wrote:

However, I’m trying to figure out how to search the RoR way based on the
role and some other criteria. �For example, if I want to search for all
users whose first name is Bob and have a role ‘admin’, what would I type
in the conditions part of the query to filter by role? �I know that with
a User.find… query, I can no longer use the “self” keyword to call an
instance method.

You going to have to use a join so that you can have conditions on
both tables eg

User.find :all, :joins => :roles, :conditions => ["roles.name = ? AND
users.name = ? ", ‘admin’, ‘Bob’]

Or you also do it less verbosely by reversing that: Role.find_by_name
(‘admin’).users.find :all, :conditions => {:name => ‘Bob’}

Fred