Rails:范围整个模型

时间:2017-08-26 16:48:26

标签: ruby-on-rails activerecord model scope

我在想象类似的东西:

class User < ApplicationRecord

    default_scope -> { where(public: true) }

end

现在无论何时访问用户模型,都应该始终将where(public: true)附加到查询。因此all最终会成为all.where(public: true)

我试图将这样的内容放到ApplicationRecord类中以覆盖所有继承模型的行为,因此手动覆盖对我来说不是一个选项。

2 个答案:

答案 0 :(得分:1)

如果所有继承模型的default_scope保持不变,那么您可以考虑将其放在自定义模型中,并让所有其他模型继承该模型

class CustomModel < ApplicationRecord
  default_scope -> { where(public: true) }
end

让其他模型继承自那个自定义模型

class A < CustomModel
end

答案 1 :(得分:0)

如果您的所有模型都有public作为属性,那么您可以通过将default_scope添加到app/models/application_record.rb来添加default_scope;

但是,拥有where(public: true) not_public这里有点棘手,因为除非您使用{{1},否则您将无法访问数据unscoped数据方法:User.unscoped

话虽如此,如果你添加一个范围scope :public, -> () { where(public: true) }并在你想确保你的用户是公开的时候调用它,它会更好:

User.public.find_by(email: 'xxxxx')