2017-12-21 16 views
2

나는이 예외를 흔들 수없는 것처럼 보입니다.ActiveRecord :: RecordNotUnique 문제를 해결하려면 어떻게해야합니까?

class Batch < ApplicationRecord 

    before_create :upcase_session_id  

    def self.for_session(session_id, opts) 
    batch = Batch.where(session_id: session_id.upcase).first_or_initialize 
    if batch.new_record? 
     batch.property = opts[:property] 
     batch.save! 
    end 
    batch 
    end 

    private 

    def upcase_session_id 
    self.session_id = session_id.upcase 
    end 
end 

호출 코드 :

def retrieve_batch 
    self.batch ||= Batch.for_session(batch_session_id, property: property) 
end 

스키마 일괄 테이블 :

create_table "batches", force: :cascade do |t| 
    t.string "session_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "property_id" 
    t.index ["property_id"], name: "index_batches_on_property_id", using: :btree 
    t.index ["session_id"], name: "index_batches_on_session_id", unique: true, using: :btree 
    end 

나는이 예외를 받고 중지하려면이 코드를 변경하는 방법을 잘 모르겠어요 나는 다음과 같은 코드가 있습니다 내가 계속지고있어.

예외 :

PG::UniqueViolation: ERROR: duplicate key value violates unique constraint 
"index_batches_on_session_id" DETAIL: Key (session_id)=(A19A5BFD-A90C-40B4-9384-5C6C1C88213B) already exists. : 
INSERT INTO "batches" ("session_id", "created_at", "updated_at", "property_id") 
VALUES ($1, $2, $3, $4) RETURNING "id" where my schema.rb shows: 
t.index ["session_id"], name: "index_batches_on_session_id", unique: true, using: :btree 
+1

당신이 당신의'Batch' 모델의 코드를 제공 할 수 있을까요? –

+0

주어진 정보는 충분하지 않지만 다음과 같이 가정합니다 : 1 :) session_id는 저장하기 전에 donwcase로 설정되므로 검색 줄에서 'session_id.upcase'로 검색하면 항상 새 레코드가 반환됩니다. 저장 줄'batch.session_id'는 소문자로 저장되므로 예외가 발생합니다. 2 :'property'는'save! '전에 확인해야 할 몇 가지 고유 한 유효성 검사를합니다. – Frozenna

+0

@MikhailKatrin 내 모델 코드를 – Kamilski81

답변

3

이 예외는 그것이 고유성 제약 조건을 위반 때문에 레코드를 삽입 할 수없는 경우에 발생합니다. . 제점은 모든 C 럼이 될 수 있으 G로 테이블 제한 조건을 알려 주어야합니다.

이 작업을 시도 할 수 :

class Batch < ApplicationRecord 

    def self.for_session(session_id, opts) 
    Batch.where(session_id: session_id.upcase).first_or_create(property: opts[:property]) 
    end 

end 
+0

에 스키마와 예외를 추가 @nattfodd 키 값이 고유 제한 조건을 위반 복제 "index_batches_on_session_id" 상세 : 키 (SESSION_ID) = (A19A5BFD- A90C-40B4-9384-5C6C1C88213B)가 이미 존재합니다. "아이디"돌아 가기 "배치"("SESSION_ID", "created_at", "updated_at", "PROPERTY_ID") VALUES ($ 1, $ 2 $ 3 $ 4) 속으로 삽입 내 schema.rb 보여준다 여기서 t를 .index [ "session_id"], 이름 : "index_batches_on_session_id", unique : true, 사용 : : btree – Kamilski81

+0

인덱스가 손상 될 가능성이 있습니까? REINDEX로 문제가 해결되는지 확인할 수 있습니다. – Pablo

+0

아니요. REINDEX가 문제를 해결하지 못하는 것처럼 보입니다. ( – Kamilski81