【问题标题】:scope in rails 4 , how to add conditionsrails 4中的范围,如何添加条件
【发布时间】:2014-10-17 08:24:51
【问题描述】:
我在我的模型中使用默认范围
def self.default_scope
where ('locked_at IS NULL' )
end
这样没有人可以搜索锁定用户,但我想如果登录用户是管理员,那么他应该能够找到锁定用户,我不确定它会如何工作
在数据库中,在用户表中我有列名“admin”,它告诉我们谁是管理员。
我尝试在模型中进行会话,但我认为这不是一个好主意,请给我一些建议
【问题讨论】:
标签:
ruby
ruby-on-rails-4
ruby-on-rails-3.2
【解决方案1】:
首先,你不应该在方法和带有参数的括号之间放置空格:
where('locked_at is NULL')
第二。如果您的管理员已登录,您可能应该简单地使用unscoped:
User.unscoped
避免使用您的默认范围。
【解决方案2】:
您可以使用 unscoped 它返回此类的范围,而无需考虑 default_scope
类似这样的:
class User < ActiveRecord::Base
def self.default_scope
where ('locked_at IS NULL')
end
end
=> User.all # Fires "SELECT * FROM users WHERE locked_at = NULL"
=> User.unscoped.all if current_user.admin# Fires "SELECT * FROM users"
不要忘记将if 条件放在无作用域之后。因为正如您提到的,用户表有 admin 列,我假设它具有布尔类型。如果是true,那么只有它应该是无范围的。