创建通过default_scope找不到的记录

时间:2013-06-07 11:55:26

标签: ruby-on-rails activerecord

考虑模型

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)

这似乎是对另一个问题的错误答案,或者也许是正确的答案。还有其他选择吗?

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

最好的解决方案是不使用default_scope。仅当始终需要在搜索记录时应用范围时,才应使用default_scope。因此,如果您需要找到queued为真的记录,那么您不应该使用default_scope

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

Product.unscoped.queued

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