0

考虑模型

class Product < ActiveRecord::Base
  scope :queued, lambda { where(queued: true) }
  scope :unqueued, lambda { where(queued: false) }

  default_scope unqueued
end

Product.first 产生 SQL 查询

SELECT "products".* FROM "products" WHERE "products"."queued" = 'f' LIMIT 1

现在,如果我想创建一个“不符合默认范围”的记录怎么办?像这样:

Product.queued.create!

该产品实际上是创建的,但 ActiveRecord 会产生错误,因为它试图通过它的 id 和默认范围来查找产品:

ActiveRecord::RecordNotFound:
  Couldn't find Product with id=15 [WHERE "products"."queued" = 'f']

有解决方法吗?我需要确保我创建的产品已排队。一个简单的解决方法是

p = Product.create
p.update_column(:queued, true)

不过,这似乎是另一个问题的错误答案,或者它可能是正确的答案。有替代品吗?

谢谢你的时间。

4

1 回答 1

2

最好的解决方案是不使用default_scope. 仅当您在搜索记录时始终default_scope需要应用范围时才应使用。所以,如果你需要找到一个真实的记录,那么你不应该使用.queueddefault_scope

超越 default_scope 的另一种方法是使用unscoped方法,即:

Product.unscoped.queued

但是,一般来说,如果您需要使用 ActiveRecord 来查找排队的产品,我建议您删除您的default_scope.

于 2013-06-07T12:04:12.713 回答