#new_record?関数は、レコードが保存されているかどうかを判断します。ただし、after_save
フックでは常にfalseです。レコードが新しく作成されたレコードか、更新された古いレコードかを判断する方法はありますか?
before_create
などの別のコールバックを使用してモデルにフラグを設定したり、dbに別のクエリを要求したりしないことを望んでいます。
どんなアドバイスも大歓迎です。
編集:after_save
フックでそれを決定する必要があり、私の特定のユースケースでは、updated_at
またはupdated_on
タイムスタンプはありません
after_save
コールバックにこれを使用したいと考えていました。
より簡単な解決策は、id_changed?
(update
で変更されないため)またはタイムスタンプ列が存在する場合はcreated_at_changed?
を使用することです。
更新:@mitsyが指摘しているように、コールバック以外でこのチェックが必要な場合は、id_previously_changed?
を使用します。 docs を参照してください。
いいえRailsここで私が知っている魔法、あなたは自分でそれをしなければなりません。仮想属性を使用してこれをきれいにすることができます...
モデルクラスで:
def before_save
@was_a_new_record = new_record?
return true
end
def after_save
if @was_a_new_record
...
end
end
doがupdated_at
タイムスタンプを持つ人のための、さらに別のオプション:
if created_at == updated_at
# it's a newly created record
end
after_create
コールバックがあります。このコールバックは、レコードが新しいレコードである場合にのみ保存されます。これが変更および保存された既存のレコードである場合に使用するafter_update
コールバックもあります。 after_save
またはafter_create
が呼び出された後、両方の場合にafter_update
コールバックが呼び出されます。
新しいレコードが保存された後に何かを行う必要がある場合は、after_create
を使用します。
詳細はこちら: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
オブジェクトはすでに保存されているため、以前の変更を確認する必要があります。 IDは、作成後にのみ変更する必要があります。
# true if this is a new record
@object.previous_changes[:id].any?
インスタンス変数@new_record_before_save
もあります。次の方法でアクセスできます。
# true if this is a new record
@object.instance_variable_get(:@new_record_before_save)
どちらもかなりいですが、オブジェクトが新しく作成されたかどうかを知ることができます。お役に立てば幸いです!