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