24

プロパティを更新したいIDのリストがある場合updated_at、データベースのフィールドは変更されないようです。これが私が意味することです:

ids = [2,4,51,124,33]
MyObj.where(:id => ids).update_all(:closed => true)

この更新が実行された後、updated_atフィールドは変更されません。ただし、レールコンソールに入っrails cてこれを行うと:

obj = MyObj.find(2)
obj.closed = false;
obj.save!

このステートメントの後、updated_atフィールドの値が変更されます。どうしてこれなの?updated_atこれが発生したときに更新をリッスンし、アプリ全体のフローを実行しているため、アプリのこのフィールドに依存していますか?

編集

私はdax答えから次のことを知りました:

Timestamps

Note that ActiveRecord will not update the timestamp fields (updated_at/updated_on) when using update_all().

一度に 1 つのレコードを更新したくないのですが、これを回避する方法はありますか? SQLレベルに頼らずに?

4

4 に答える 4

1

すべてを更新します。このメソッドは、単一の SQL UPDATE ステートメントを構築し、データベースに直接送信します。関連するモデルをインスタンス化せず、Active Record コールバックまたは検証をトリガーしません。update_all に渡された値は、ActiveRecord の型キャスト動作を通過しません。そのまま SQL データベースに渡すことができる値のみを受け取る必要があります。

そのため、コールバックも検証もトリガーしません。タイムスタンプの更新はコールバックで行われます。update_atは参照用のコールバックです

于 2015-01-07T07:06:32.343 に答える