Railsアプリでは、個々のステップではなく、変更の最終結果のみを検証して、一度に変更のバッチを作成することは可能ですか?
それは少し曖昧な質問だったので、具体的にしましょう。食料雑貨店のストアアプリがあるとします。
class Store < ActiveRecord::Base
has_many :fruits
end
class Fruit < ActiveRecord::Base
belongs_to :store
attr_accessible :kind, :number, :price
validates_uniqueness_of :kind, :scope => :store_id
end
次のデータをデータベースにシードしました。
fruits:
store_id | kind | number | price
----------------------------------------
1 | apple | 10 | 0.15
1 | banana | 80 | 0.02
1 | cherry | 25 | 0.50
しかし、私はめちゃくちゃになって、バナナとサクランボの数と価格を交換したことに気づきました。私はこれを行うことはできません:
store = Store.find(1)
old_bananas = store.fruits.where("kind = banana").first
old_cherries = store.fruits.where("kind = cherry").first
old_bananas.kind = "cherry"
old_cherries.kind = "banana"
old_bananas.save! # => Validation Error
old_cherries.save!
2番目の行を保存した後は問題ないのに、最初の行を保存するときに一意性の制約に違反しているためです。両方の保存をまとめてバッチ処理し、すべての変更を一度に行った結果のみを検証に表示させることは可能ですか?
(回避策を考えることができます-たとえば、検証を行った場合:allow_nil
、それらのいずれかを変更する前に各行をゼロにします-しかし、「適切な」解決策が存在するかどうかを知りたいです)