私はModelフィールドを持つRailsアプリケーションを持っています。データベースでは、このフィールドには固有の制約が設定されています。 モデルレベルでは、uniqueness: { case_sensitive: false }, on: :create
チェックも行っています。検証が失敗した場合にActiveRecordトランザクションをロールバックしない方法
私の考えは、ActiveRecord検証が行われた後、一意性チェックが失敗した場合、同じテーブル内の既存のすべてのレコードのカウンタをインクリメントしたいと考えています。だから今私がしていることはこれです:
after_validation :term_exists
private
def term_exists
if self.errors.added? :name, :taken
Term.where('LOWER(name) = LOWER(?)', self[:name]).update_all('popularity_counter = popularity_counter + 1')
end
end
これは素晴らしいですが、私はそれに対してテストを実行すると、カウンタは増分しません。私は、この理由は、検証に失敗した場合にトランザクション内のすべてがロールバックされるということだと思います。
しかし、この種の問題を解決するにはどうすればよいでしょうか?このようなロジックをコントローラに保存しないことを強くお勧めします。
しかし、検証に失敗すると、トランザクションもロールバックされますか? – Kaspar
私はそれについては分かりません。ロールバックはコミットがあるときに実行されますが、まだコミットを取得していません。あなたは妥当性確認段階の直前です。そして、ところで、Railsにはafter_rollbackコールバックがあるので、検証中にフラグを設定し、そのフラグをafter_rollbackコールバックで使用してカウンタを更新することができます。いずれか他の方法で動作します。あなたはそれらを試し、何が起きたらログをチェックする必要があります。私は頭の上から覚えていない。 –
Allrightは、実験して受け入れる答えを見ていきます。ありがとう! – Kaspar