gpt4 book ai didi

ruby-on-rails - 修改has_many的行为还是使用范围?

转载 作者:行者123 更新时间:2023-12-03 05:10:47 25 4
gpt4 key购买 nike

我有一个看起来像这样的类(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com