1

尝试保存先前已销毁的 Mongoid 对象时出现奇怪的行为。给定这个类定义:

class Foo
  include Mongoid::Document
end

保存实例,然后将其删除后,我无法再次保存:

Foo.count # => 0
f = Foo.create # => #<Foo _id: 522744a78d46b9b09f000001, >
Foo.count # => 1
f.destroy # => true
Foo.count # => 0
f.save # => true
# it lied - didn't actually save:
Foo.count # => 0
# these may be relevant:
f.persisted? # => false
f.destroyed? # => true
f.new_record? # => false
f.changed? # => false

这是我希望通过的失败的 RSpec 测试:

describe Foo do
  it 'should allow saving a Foo instance after destroying it' do
    expect(Foo.count).to eq(0)
    f = Foo.create
    expect(Foo.count).to eq(1)
    Foo.all.destroy
    expect(Foo.count).to eq(0)
    f.save # => true
    expect(Foo.count).to eq(1) # error - returns 0
  end
end

这是预期的行为吗?我的用例实际上是使用单例对象(虽然不想通过提及它来使问题变得更复杂);Foo.instance返回被破坏的相同对象Foo.all.destroy

4

1 回答 1

2

型号#save

以原子方式将更改的属性保存到数据库,或者插入新的文档。将引发验证失败的错误。

销毁后,文档不是新的,也没有属性发生变化,所以save直接返回,没有错误。从严格意义上讲,这似乎是预期的行为。

你可以使用Model#upsert

upsert在文档上执行 MongoDB 。如果文档存在于数据库中,它将被内存中文档的当前属性覆盖。如果该文档在数据库中不存在,则将其插入。

这实际上将使用相同的 ID 保存文档,但它仍将被frozen?标记为destroyed?. 因此,最好只clone按照 insane-36 在评论中建议的文件。

于 2013-09-04T16:35:26.427 回答