2015-01-24 2 views
0

Mongoid 4.0.0과 Rails 4에서 이상한 동작이 발생했습니다. 1-N 관계가 있으며 N 측을 저장하려고하면 중복 키 오류 인덱스가 나타납니다. 관계의. 내가 당신에게 몇 가지 코드를 보여주지 : 여기몽고이 1-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가 중복되는지를 확인하기 위해 콜렉션을 만든 후에. 또한 문 pur.collection_id = col.id을 제거하면 다음 오류가 발생합니다. NoMethodError: undefined method 'insert' for nil:NilClass 그러면 구매 객체를 저장하려고 할 때 Mongoid가 이미 유지되어 있지만 1-N 관계의 다른면을 자동으로 삽입하려고 시도합니다.

pur.collection_id = col.idpur.collection = col으로 변경하면 아무런 변화가 없습니다.

나는 이것을 Collection.create에서 Collection.new으로 변경하여 해결할 수 있습니다. 그러나 이것이 가능한 기존 솔루션의 구매를 생성 할 수 있어야합니다.

왜 이런 일이 발생합니까? 나는 documentation을 보았고 나의 행동으로는 아무런 의미가 없다. (어쩌면 나는이 스크린을 너무 오랫동안 보아왔다).

어떻게 해결할 수 있을까요?

답변

0

그래서 마침내 알아 냈습니다. Collection 모델의 이름을 다른 이름으로 바꾸면 Mongoid가 모델의 이름을 좋아하지 않는 것처럼 보입니다. 격리 된 네임 스페이스 엔진에서도 마찬가지입니다.