Rails 3 и Acl9: найти все предметы для данного объекта/роли

Я использую rails3 с acl9 для авторизации. Я пытаюсь понять ARel и рельсовый способ запроса.

У меня есть Пользователь, который принадлежит Компании, и у пользователя есть заданная роль (acl9 обеспечивает сантехнику) над Компанией. Как мне получить всех Пользователей из данной Компании с определенной ролью? Я хочу фильтровать результаты в базе данных, а не фильтровать их в приложении.

Я хочу что-то вроде этого:

# 
# authorizable_id = 1 is the company's id
# 'collaborator' and '1' would be params for my scope
#
select * from users
inner join roles_users
on roles_users.user_id = users.id
inner join roles
on roles_users.role_id = roles.id
where roles.authorizable_type='Company'
and   roles.authorizable_id = 1
and   roles.name = 'collaborator';

#usage with scope
@collaborators = User.with_role_and_company('collaborator',current_user.company)

Я знаю, что у rails3 есть sql api, но я родом из Java/Grails, и большинство ORM, которые я использую, имеют некоторый ORM api (я полагаю, что datamapper работает так, но я использую простой rails3).


person Miguel Ping    schedule 21.11.2010    source источник


Ответы (2)


Я выяснил:

 class << self
   def with_role_in_company(role, company)
      joins(:roles).
          where(:roles => {:authorizable_type => 'Company'}).
          where(:roles => {:authorizable_id => company.id}).
          where(:roles => {:name => role})
    end
  end
person Miguel Ping    schedule 23.11.2010

Я также добавил эту функцию в acl9 1.2, так что теперь вы можете просто сделать:

company.users :collaborator
person smathy    schedule 22.01.2015