考虑模型
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' 限制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)
这似乎是对另一个问题的错误答案,或者也许是正确的答案。还有其他选择吗?
感谢您的时间。
答案 0 :(得分:2)
最好的解决方案是不使用default_scope
。仅当始终需要在搜索记录时应用范围时,才应使用default_scope
。因此,如果您需要找到queued
为真的记录,那么您不应该使用default_scope
。
另一种超越default_scope的方法是使用unscoped方法,即:
Product.unscoped.queued
但是,一般情况下,如果您需要使用ActiveRecord查找排队的产品,我建议您删除default_scope
。