2017-12-21 5 views
2

Ich kann diese Ausnahme nicht erschüttern. Ich habe den folgenden Code:Was kann ich schreiben, um ActiveRecord :: RecordNotUnique zu beheben?

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 

Telefonvorwahl:

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

Schema Batches Tabelle:

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 

Ich bin nicht sicher, wie ich diesen Code ändern zu stoppen diese Ausnahme immer das bekomme ich immer.

Ausnahme:

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

Könnten Sie Code Ihrer 'Batch' Modell zur Verfügung stellen? –

+0

Die angegebenen Informationen sind nicht genug, aber hier ist, was ich annehmen kann: 1 :) session_id ist auf donwcase vor speichern festgelegt, so in Ihrer Suchzeile, wo Sie nach 'session_id.upcase' immer neuen Datensatz suchen, und in der Sicherungszeile 'batch.session_id' wird als Downcase gespeichert, daher wird die Ausnahme ausgelöst. 2 :) 'property' hat eine eindeutige Validierung, die vor' save! 'Überprüft werden muss. – Frozenna

+0

@MichailKatrin Ich habe meinen Modellcode über – Kamilski81

Antwort

3

Die Ausnahme wird ausgelöst, wenn ein Datensatz kann nicht eingesetzt werden, da es eine Eindeutigkeitsbedingung verletzen würde. Sie sollten uns die Tabellenbedingungen mitteilen, da das Problem irgendeine Spalte sein könnte.

Sie konnten dieses versuchen:

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

Hinzugefügt ich immer noch diesen Fehler mit dem Code: PG :: UniqueViolation: ERROR: Nachschlüssel Wert gegen eindeutige Einschränkung "index_batches_on_session_id" DETAIL: Taste (session_id) = (A19A5BFD- A90C-40B4-9384-5C6C1C88213B) existiert bereits. : INSERT INTO "Chargen" ("Sitzungs_ID", "created_at", "updated_at", "property_id") VALUES ($ 1, $ 2, $ 3, $ 4) RÜCKKEHR "id" wo mein schema.rb zeigt: t .index ["session_id"], Name: "index_batches_on_session_id", unique: true, unter Verwendung von:: btree – Kamilski81

+0

Besteht die Möglichkeit, dass der Index beschädigt ist? Sie könnten REINDEX versuchen, um zu sehen, ob es das Problem löst. – Pablo

+0

Nein. Sieht so aus, als hätte REINDEX das Problem nicht gelöst :( – Kamilski81

Verwandte Themen