2017-08-26 37 views
0

我想象类似这样的东西:Rails的:范围整个模型

class User < ApplicationRecord 

    default_scope -> { where(public: true) } 

end 

现在,只要用户模式被访问应该始终添加where(public: true)到querys。所以all最终会成为all.where(public: true)

我想把这样的东西放入ApplicationRecord类来覆盖所有继承模型的行为,因此手动覆盖对我来说不是一种选择。

+0

这是否'default_scope'将是相同的所有继承:

话虽这么说,如果你添加一个范围scope :public, ->() { where(public: true) }并调用它,只要你想确保你的用户是公开的,最好楷模? – Pavan

+0

@Pavan是的。这就是为什么我想继承:-) – jonhue

回答

1

如果default_scope保持同所有的继承车型,那么你可以考虑把在自定义模型,然后让所有车型从模型

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

继承,并让其他车型从这样的定制机型继承所以

class A < CustomModel 
end 
+0

和'default_scope'的作品? – jonhue

+1

@jonhue AFAIK它应该工作。给它一个尝试:) – Pavan

+0

我不知道'default_scope'的存在,但似乎我的直觉是正确的:) – jonhue

0

如果你所有的型号都有public作为一个属性,那么你可以将它添加到app/models/application_record.rb添加的所有车型default_scope;

然而,有where(public: true)default_scope是棘手的在这里,因为你将不能够除非你使用unscoped方法来访问数据not_public数据一点点:User.unscoped

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

+1

我知道使用default_scope的好处和'风险',我没有用它作为例子I在帖子中说明了它。我用它来创建一个gem - > https://github.com/slooob/sandboxy然而,我通过将它绑定到gem提供的'sandboxy'方法来完成类似于将它添加到application_record的操作。宝石要求不需要额外的范围来使其按照预期工作。 – jonhue