我有一个看起来像这样的类(class):
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| ... }
唯一的问题是这感觉不对。而不是编写包含以下内容的 Controller 操作:
@companies = Company.accessible_by(current_user)
我写起来会更舒服
@companies = current_user.companies
是否有一个好方法来重写 User#companies 方法来适应这种行为?或者,我应该对在 Company 上使用范围感到满意吗?
最佳答案
我正在努力解决类似的问题。我可以设计的唯一可接受的解决方案是 association extension ,它会覆盖管理员用户的查询并传递普通用户的查询,不受干扰。
# 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
关于ruby-on-rails - 修改has_many的行为还是使用范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7168138/