我正在尝试设置默认范围,以便notified: true
被软删除的用户。 notified
是一个布尔数据列。
这是我尝试过的:
class User < ActiveRecord::Base
default_scope { where('notified != ?', true) }
#...
end
但是这样,没有用户出现在任何范围内。即 - 所有用户似乎都被软删除,即使是notified: false
或notified: nil
的用户也是如此。我的范围出了什么问题?
答案 0 :(得分:2)
我建议使用数据库理解的布尔值。在这种情况下,您希望看到通知不正确的用户,因此我指定用户:
default_scope { where('notified IS NOT TRUE') }
这样,如果用户的布尔数据库值为FALSE
或NULL
,则用户只会出现在其他范围内。
注意:默认范围实际上被认为是代码气味...因为它们有点神奇并且隐藏了当您取出用户时的真正含义。您可能希望创建active
和inactive
范围,并在代码中明确指定它们,例如:
scope :active ->{ where('notified IS NOT TRUE') }
scope :inactive ->{ where('notified IS TRUE') }
# in your controller
def index
@users = User.active.all
end
答案 1 :(得分:1)
根据您的目标设置默认范围,以便软件删除通知!= true的用户。&#39;,您应该使用default_scope { where(manual_down: true) }
,它只会检索包含该列为TRUE,忽略其他列(FALSE或NIL)
我完全赞同Taryn East。更改/删除default_scope可能需要对依赖于该模型的逻辑进行大量修改,因此只有在您确定以后不更改default_scope条件时才使用它(通常不是这种情况)。