acl9 находит только модель объекта, который удовлетворяет object.accepts_role? (роль_имя, текущий_пользователь) - PullRequest
4 голосов
/ 30 октября 2009

Я довольно новичок в рельсах, и я впервые использую authlogic + acl9. Я выполнил шаги установки по умолчанию для обоих плагинов.

Пока все отлично работает, но у меня проблемы с поиском элегантного решения этой проблемы:

Допустим, у меня есть класс моделей под названием Products. При создании нового объекта Product я назначаю current_user в качестве владельца:

current_user.has_role! :owner, @product

Я зарегистрировал второго пользователя и убедился, что эта часть работает.

В контроллере продуктов у меня есть метод индекса, просто возвращающий все продукты:

def index
  @products = Products.all
end

Мой вопрос таков: как я могу вызвать метод find для Products, чтобы получить только те продукты, в которых current_user является владельцем: owner? Так что я использовал интерфейс acl9, что означало бы:

@product.accepts_role?(:owner, current_user)

Одна из возможностей, вероятно, заключается в том, чтобы сначала получить все продукты, а затем создать новый массив, содержащий только значения current_user. так что может быть так:

@products = []
products = Products.all
products.each do |p|
  @products << p if p.accepts_role?(:owner, current_user)
end 

Это решение кажется довольно расточительным. Итак, как правильно это сделать?

Спасибо всем!

Ответы [ 4 ]

1 голос
/ 06 января 2010

как насчет выполнения всего в одном запросе:

@products = Product.all.select { |p| p.accepts_role?(:owner, current_user)}

но идея остается такой, как вы сами ее предложили

0 голосов
/ 23 января 2015

Добавьте эти области к вашей Product модели:

scope :roled_by, -> ( r, u ) { where id: u.role_objects.select(:authorizable_id).where( :name => r, :authorizable_type => self ) }
scope :owned_by, -> (u) { roled_by :owner, u }

... и назовите его так: Product.owned_by current_user - вы можете использовать тот же шаблон, чтобы добавить столько ролей, сколько вам нужно (или просто позвонить Product.roled_by :owner, current_user, если хотите).

О, и обратите внимание, что я использовал метод role_objects по умолчанию, если вы установили его на что-то другое (как это часто бывает), то отрегулируйте его в области действия.

0 голосов
/ 24 декабря 2009

Я не уверен, почему вы хотите присоединиться. Если вы следовали настройке по умолчанию для acl9, у вас должно быть отношение «многие ко многим» между пользователем и его ролями, а также отношение «многие к одному» между ролями и каждым объектом авторизации. Поэтому, если у вас есть все отношения, правильно заданные в ваших моделях, вы сможете получить объекты с помощью чего-то простого:

current_user.roles.find(:first, :conditions => { :name => 'owner' }).products

Вам может понадобиться специально описать продукты как именованную область или ассоциацию в ролевом образце, и вы можете еще больше упростить все это, включив этот искатель в именованную область.

0 голосов
/ 11 декабря 2009

Я недавно пришел к такому же выводу в проекте, над которым я работал.

У меня возникло желание сделать несколько объединений в таблицах role и role_user с таблицей продуктов, но в итоге я пошел по вышеуказанному подходу.

Хорошо работает сейчас, но не будет хорошо масштабироваться.

...