Rails强制范围

时间:2014-01-24 03:59:25

标签: ruby-on-rails activerecord

我知道可以在Rails模型中创建default_scope来限制选择。但这可以/将被一个没有范围的电话覆盖。

是否可以使用默认应用的作用域,而不管Rails作用域方法如何?可以使用initialize方法完成的事情吗?

1 个答案:

答案 0 :(得分:2)

是的,你可以修补ActiveRecord :: Base方法。

请参阅未范围的方法:

def unscoped #:nodoc:
  block_given? ? relation.scoping { yield } : relation
end

你应该使用补丁#relation方法来包含你的默认范围。

将以下文件放在config/initializers目录中:

module ActiveRecord

  class Base

    def relation
      base_relation = super
      base_relation.where(#default conditions)
    end
  end
end

您也可以使用ActiveSupport :: Concern,这可能是首选方式,我只想指出您应该扩展#relation方法。无论您扩展ActiveRecord的方式是什么,我的建议是您应该坚持使用#default_scope方法并编写必要的测试以确保关系不是未绑定的。