为什么这 default_scope 不起作用?
Why isn't this default_scope working?
我正在尝试设置默认范围,以便软删除 notified: true
中的用户。 notified
是一个布尔数据列。
这是我试过的:
class User < ActiveRecord::Base
default_scope { where('notified != ?', true) }
#...
end
但是这样一来,任何范围内都没有用户出现。即 - 所有用户似乎都被软删除,即使是 notified: false
或 notified: nil
的用户。我的范围有什么问题?
根据 'set a default scope so that Users where notified != true are soft-deleted.' 的 objective,您应该使用 default_scope { where(manual_down: true) }
,它只会检索该列为 TRUE 的记录,而忽略其他列(FALSE 或 NIL)
我完全同意 Taryn East 的观点。 Changing/removing default_scope 可能需要对依赖于该模型的逻辑进行大量修改,因此只有在您确定以后不会更改 default_scope 条件(通常不会案)。
我建议使用数据库可以理解的布尔值。在这种情况下,您希望看到收到不正确通知的用户,因此我将用户:
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
我正在尝试设置默认范围,以便软删除 notified: true
中的用户。 notified
是一个布尔数据列。
这是我试过的:
class User < ActiveRecord::Base
default_scope { where('notified != ?', true) }
#...
end
但是这样一来,任何范围内都没有用户出现。即 - 所有用户似乎都被软删除,即使是 notified: false
或 notified: nil
的用户。我的范围有什么问题?
根据 'set a default scope so that Users where notified != true are soft-deleted.' 的 objective,您应该使用 default_scope { where(manual_down: true) }
,它只会检索该列为 TRUE 的记录,而忽略其他列(FALSE 或 NIL)
我完全同意 Taryn East 的观点。 Changing/removing default_scope 可能需要对依赖于该模型的逻辑进行大量修改,因此只有在您确定以后不会更改 default_scope 条件(通常不会案)。
我建议使用数据库可以理解的布尔值。在这种情况下,您希望看到收到不正确通知的用户,因此我将用户:
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