2016-05-06 4 views
0

Ich habe einen Sidekiq Job mit first_or_create.Verwendung von first_or_create in Sidekiq Job

class JobWithFirstOrCreate 
    analysis = Analysis.where(standard_id: standard_id).first_or_create 
    analysis.save! 
end 

Dies führt jedoch dazu, dass die Eindeutigkeitsprüfung fehlschlägt, da doppelte Analysedatensätze erstellt werden. Ich verstehe das, weil first_or_create nicht atomar ist.

Also, was ist der richtige Weg, dies zu tun?
Ich möchte Jobs gleichzeitig ausführen, in denen ich aktualisieren, wenn ein Analyse-Datensatz bereits vorhanden ist, sonst einfügen.

Antwort

0

Schauen Sie in den Begriff "Upsert". ActiveRecord kann das nicht nativ tun, aber Sie können das SQL von Hand ausführen.

+0

Ich benutze Postgres und die folgende Abfrage scheint gut zu funktionieren. "INSERT in Analyse (standard_id, top_score) Werte (# {standard_id}, # {top_score}) bei Konflikt (standard_id) update set (top_score) = (# {top_score})" –

+0

Ja, das wird gut funktionieren. Mysql kann etwas ähnliches tun. –