为什么这个default_scope没有工作?

时间:2015-03-02 00:02:06

标签: ruby-on-rails ruby activerecord scope default-scope

我正在尝试设置默认范围,以便notified: true被软删除的用户。 notified是一个布尔数据列。

这是我尝试过的:

class User < ActiveRecord::Base
  default_scope { where('notified != ?', true) }
  #...
end

但是这样,没有用户出现在任何范围内。即 - 所有用户似乎都被软删除,即使是notified: falsenotified: nil的用户也是如此。我的范围出了什么问题?

2 个答案:

答案 0 :(得分:2)

我建议使用数据库理解的布尔值。在这种情况下,您希望看到通知不正确的用户,因此我指定用户:

default_scope { where('notified IS NOT TRUE') }

这样,如果用户的布尔数据库值为FALSENULL,则用户只会出现在其他范围内。

注意:默认范围实际上被认为是代码气味...因为它们有点神奇并且隐藏了当您取出用户时的真正含义。您可能希望创建activeinactive范围,并在代码中明确指定它们,例如:

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条件时才使用它(通常不是这种情况)。