Mongoid 1-N插入重复键错误

时间:2015-01-24 02:54:13

标签: ruby-on-rails mongodb ruby-on-rails-4 mongoid mongoid4

我从Mongoid 4.0.0和Rails 4得到一个奇怪的行为,我有一个1-N关系,当我尝试保存关系的N侧时,我得到一个重复的键错误索引。让我给你看一些代码:

module MyEngine
  class Collection
    include Mongoid::Document
    include Mongoid::Timestamps

    field :name, type: String
    field :price, type: Integer, default: 0

    has_many :purchases, class_name: 'MyEngine::Purchase'

    validates_presence_of :name
  end
end

module MyEngine
  class Purchase
    include Mongoid::Document
    include Mongoid::Timestamps

    field :paid, type: Integer, default: 0

    belongs_to :collection, class_name: 'MyEngine::Collection'
  end
end

以下测试失败了:

    test "should save purchase" do
      col = Collection.create(name:'test')
      pur = Purchase.new
      pur.collection_id = col.id
      assert pur.save, "Could not save purchase"
    end

执行此测试会产生以下结果:

Moped::Errors::OperationFailure: The operation: #<Moped::Protocol::Command
  @length=74
  @request_id=7
  @response_to=0
  @op_code=2004
  @flags=[]
  @full_collection_name="dummy_test.$cmd"
  @skip=0
  @limit=-1
  @selector={:getlasterror=>1, :w=>1}
  @fields=nil>
failed with error 11000: "insertDocument :: caused by :: 11000 E11000 duplicate key error index: dummy_test.loot_collections.$_id_  dup key: { : ObjectId('54c3057350686f51a8000000') }"

我在创建集合后添加了puts命令,以验证其ID是否与正在复制的ID相同。此外,删除语句pur.collection_id = col.id会导致以下错误:NoMethodError: undefined method 'insert' for nil:NilClass这使我相信当我尝试保存Purchase对象时,Mongoid会自动尝试插入1-N关系的另一端,虽然它已经存在。

请注意,将pur.collection_id = col.id更改为pur.collection = col不会改变任何内容。

我可以通过将Collection.create更改为Collection.new来解决此问题,但这不是一个可行的解决方案,正如您可能想象的那样,我需要能够创建现有收藏集的购买。

为什么会这样?我查看了documentation并且没有提到这种行为,在我看来这没有任何意义(或者我可能已经在这个屏幕上看了太长时间)。

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

所以我终于弄明白了,将模型Collection重命名为其他解决问题的东西,看起来Mongoid并不喜欢模型的名称,即使在孤立的命名空间引擎中也是如此。