在Rails中的每个查询中注入条件

时间:2014-12-23 18:52:33

标签: ruby-on-rails ruby-on-rails-3

我的一些模型有一个名为" company_id"。

的列

我需要这些模型中的所有查询都有一个基于此列的条件,因此我可以轻松地将公司行分开。

这样的事情:

Customer.where(state: x).`where(company_id: current_company)`...

如何拦截此方法以强制执行此额外条件?

2 个答案:

答案 0 :(得分:1)

我建议使用关注点将此要求作为默认范围添加到所有模型中。

module HasCompany
  extend ActiveSupport::Concern

  included do
    default_scope { where(company_id: current_company) }
  end
end

class Customer < ActiveRecord::Base
  include HasCompany
  ...
end

注意:只有在模型上可以访问current_company作为类方法时,此方法才有效。

答案 1 :(得分:0)

此代码在哪里?它看起来像控制器逻辑?如果它在控制器中,那么您可以在应用程序控制器中的current_company中设置before_action - 可能就像您已经在做的那样。假设您在公司和客户之间存在has_many关系,您应该current_company.customers.where(state: x)

如果此代码存在于模型中,那就是事情变得棘手的时候。您不应该在模型中访问current_company,因为它处理当前请求。