2015-01-24 2 views
0

Я получаю странное поведение от Mongoid 4.0.0 и Rails 4, у меня есть отношение 1-N, и я получаю дубликат индекса ключевых ошибок, когда я пытаюсь сохранить N сторону отношений. Позвольте мне показать вам код:Mongoid 1-N insert duplicate key error

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 после создания коллекции, чтобы убедиться, что ее идентификатор совпадает с идентификатором, который дублируется. Кроме того, удаление заявления 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, и об этом поведении не упоминается, что, на мой взгляд, не имеет смысла (или, может быть, я слишком долго смотрел на этот экран).

Любая идея, как решить эту проблему?

ответ

0

Итак, я, наконец, понял это, переименовав модель Collection на что-то еще, решив проблему, похоже, что Mongoid не нравится это имя для моделей даже в изолированном движке пространства имен.