0

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

这是我尝试过的:

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

但是这样一来,任何范围内都不会出现用户。即 - 所有用户似乎都被软删除,即使是带有notified: falseor的用户notified: nil。我的范围有什么问题?

4

2 回答 2

2

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

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

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

注意:默认范围实际上被认为是代码气味......因为它们有点神奇,并且在您获取用户时隐藏了您的真正意思。您可能想要创建一个activeandinactive范围并在您的代码中明确指定它们,例如:

scope :active ->{ where('notified IS NOT TRUE') }
scope :inactive ->{ where('notified IS TRUE') }

# in your controller
def index
  @users = User.active.all
end
于 2015-03-02T00:41:51.080 回答
1

根据您的目标“设置默认范围,以便通知 != true 的用户被软删除。”,您应该使用default_scope { where(manual_down: true) },它只会检索该列为 TRUE 的记录,而忽略其他记录(FALSE 或 NIL)

我完全同意 Taryn East 的观点。更改/删除 default_scope 可能需要对依赖于该模型的逻辑进行大量修改,因此只有在您确定以后不会更改 default_scope 条件时才使用它(通常情况并非如此)。

于 2015-03-02T00:41:42.653 回答