W moim procesie wdrażania prowadzę mój plik nasion. Chcę, żeby to było idempotent, więc mogę uruchomić go wiele razy bez żadnego problemu.

Obecnie dostaję błędów głównych PG, jeśli uruchomię go wiele razy.

Mój wzór nasion wygląda tak:

user = User.create(.....)
user.save!

foo = Foo.create(....)
foo.save!

Jak mogę zrobić ten idempotent?

Czy to najlepszy sposób?

if( user.exists?(some_column: some_value) )
else
  # do insert here 
end 
0
Blankman 15 luty 2017, 17:41

2 odpowiedzi

Najlepsza odpowiedź

Możesz spróbować :

unless user.find_by(some_column: some_value)
    user.save!
end
3
devoh 15 luty 2017, 14:58

Wierzę, że możesz skorzystać z first_or_create .

User.where(email: "email@gmail.com").first_or_create do |user|
  user.name = "John"
end

Spowoduje to utworzenie tylko User za pomocą email = "email@gmail.com", jeśli nie istnieje lub zwróci Ci instancję istniejącej User.

W ten sposób można uniknąć Unique Key Violation

2
Deepak Mahakale 15 luty 2017, 14:53