我知道可以在Rails模型中创建default_scope来限制选择。但这可以/将被无范围调用覆盖。

不管Rails的作用域方法如何,是否都有可能默认应用一个范围?初始化方法可以做些什么?

最佳答案

是的,您可以猴子修补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方法并编写必要的测试以确保关系不受限制。

关于ruby-on-rails - Rails强制范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21324161/

10-10 14:50