Изменить поведение has_many или использовать область действия? - PullRequest
4 голосов
/ 24 августа 2011

У меня есть класс, который выглядит примерно так:

class User < ActiveRecord:Base
  has_many :users_companies
  has_many :companies, :through => :users_companies
end

Для простых пользователей я бы хотел, чтобы user.companies ссылался на стандартный метод связи, но когда пользователь является администратором, я хочу User.all (т.е. администраторы имеют доступ ко всем компаниям). Самый простой способ реализовать это (и то, что я всегда делал в прошлом) - это использовать область действия в классе Company, например:

scope :accessible_by, lambda { |user| ... }

Единственная проблема в том, что это просто не правильно. Вместо написания действия контроллера, которое включает в себя:

  @companies = Company.accessible_by(current_user)

Мне было бы удобнее писать

  @companies = current_user.companies

Есть ли хороший способ переопределить метод User # companies для учета такого рода поведения? Или я должен быть счастлив с использованием области на Компании?

Ответы [ 3 ]

5 голосов
/ 02 октября 2011

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

# this works for me in rails 3.1
class User < ActiveRecord:Base
  has_many :users_companies
  has_many :companies, :through => :users_companies do
    def visible
      if proxy_association.owner.admin?
        UsersCompany.scoped
      else
        self
      end
    end
  end
end

User.where(:admin => true).first.companies.visible == UsersCompany.all
0 голосов
/ 24 августа 2011

Хороший вопрос. Мне было интересно, если что-то вроде следующего является вариант, который вы бы рассмотрели

class User < ActiveRecord:Base
  has_many :users_companies
  has_many :companies, :through => :users_companies

  def viewable_companies
     admin? ? Company.all : self.companies
  end
end

Я знаю, что присвоение имен это ужасно, но, знаете, называть вещи - это серьезное дело:)

0 голосов
/ 24 августа 2011

Я довольно новичок в Rails, но это интересный вопрос, поэтому я решил бросить свои два цента. Похоже, вы сможете расширить свою ассоциацию в User с помощью метода companies, который проверяет self.is_admin? (или аналогичный) и возвращает то, что вам нужно. Смотри http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many#461-User-a-block-to-extend-your-associations

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...