Dieser Code ist ungewöhnlich.
Ich programmiere eine lange laufende Transaktionen (mit Web-API).
Also brauche ich knifflige Programm.
Ich möchte das Rollback-Objekt erneut speichern (piyo2
).Warum DB nicht ändern, wie das Rollback-Objekt erneut gespeichert wird
piyo2 = nil
ActiveRecord::Base.transaction do
piyo1 = Piyo.find_by(id: 1)
piyo1.name = 'hoge'
piyo1.save!
piyo2 = Piyo.find_by(id: 2)
piyo2.name = 'foo'
piyo2.save!
raise ActiveRecord::Rollback
end
piyo2.save! # log show BEGIN COMMIT. But Not show execute SQL.
piyo2.name # keep foo. But DB no change.
Meine Lösung.
piyo2 = nil
ActiveRecord::Base.transaction do
piyo1 = Piyo.find_by(id: 1)
piyo1.name = 'hoge'
piyo1.save!
piyo2 = Piyo.find_by(id: 2)
piyo2.name = 'foo'
piyo2.save!
raise ActiveRecord::Rollback
end
piyo2_retry = Piyo.find_by(id: piyo2.id) # one more find_by
piyo2_retry.update!(name: piyo2.name)
Dies ist die beste Lösung?
Warum piyo2.save! # log show BEGIN COMMIT. But No execute SQL.
dieser Code nicht Wok?
'piyo2.reload' zurück zum Original. Benötigen Sie eine Kopie oder einen Klon 'piyo2'? lile 'tmp_piyo = piyo2.clone' –
Klon ist eine gültige Methode. es wird den Zustand dessen widerspiegeln, was Sie in der Hand haben. dann musst du es natürlich speichern. Aber das schafft ein brandneues Piyo, nicht dauerhafte Änderungen an dem, was Sie in der Hand haben. – jaydel