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

标签 ruby-on-rails

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

相关文章:

ruby-on-rails - ElasticSearch-传递术语数组进行过滤

ruby-on-rails - Cocoon - 用于查找或创建的参数数量错误(1 代表 0):belongs_to

ruby-on-rails - Haml:控制文本周围的空白

ruby-on-rails - rails : ruby class name must base on file name?

ruby-on-rails - 使用 Capistrano 部署,未读取 JAVA_HOME

ruby-on-rails - 我可以用更惯用的 Active Record 方式写这个吗?

ruby-on-rails - 通过另一台机器请求

ruby-on-rails - Rails 错误无法找到 freedesktop.org.xml

ruby-on-rails - 每次请求时自动重新装入wisper监听器

ruby-on-rails - 未找到门卫 new_oauth_application_path