修改has_many的行为还是使用scope?

Mar*_*ing 4 ruby-on-rails

我有一个看起来像这样的类:

class User < ActiveRecord:Base
  has_many :users_companies
  has_many :companies, :through => :users_companies
end
Run Code Online (Sandbox Code Playgroud)

对于普通用户,我想user.companies参考标准关联方法,但是当用户是管理员时,我想要User.all(即管理员可以访问所有公司).我能想到的最简单的方法是实现这个(以及我过去一直做的)是在Company类上使用一个范围,例如:

scope :accessible_by, lambda { |user| ... }
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,这感觉不对.而不是编写包含以下内容的控制器操作:

  @companies = Company.accessible_by(current_user)
Run Code Online (Sandbox Code Playgroud)

我觉得写作更舒服

  @companies = current_user.companies
Run Code Online (Sandbox Code Playgroud)

有没有一种好方法可以覆盖User#companies方法来适应这种行为?或者,我是否应该对在公司使用范围感到满意?

Phi*_*p C 5

我正在努力解决类似的问题.我可以设计的唯一可接受的解决方案是关联扩展,它会覆盖管理员用户的查询并传递普通用户的查询,不受干扰.

# 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
Run Code Online (Sandbox Code Playgroud)