109

#new_record? 関数は、レコードが保存されているかどうかを判断します。after_saveしかし、フックでは常に falseです。レコードが新しく作成されたレコードか更新による古いレコードかを判断する方法はありますか?

before_createモデルにフラグを設定したり、データベースに別のクエリを要求したりするなど、別のコールバックを使用しないことを望んでいます。

アドバイスをいただければ幸いです。

編集:after_saveフックでそれを決定する必要があり、私の特定のユースケースでは、updated_atまたはupdated_onタイムスタンプはありません

4

8 に答える 8

188

after_saveこれをコールバックに使用しようとしていました。

より簡単な解決策は、id_changed?(で変更されないため)を使用するか、タイムスタンプ列が存在する場合updateでも使用することです。created_at_changed?

更新: @mitsy が指摘するように、このチェックがコールバックの外で必要な場合は、 を使用しますid_previously_changed?ドキュメントを参照してください。

于 2011-08-25T00:41:06.383 に答える
32

私が知っているレールマジックはここにはありません。自分でやる必要があります。仮想属性を使用してこれをクリーンアップできます...

モデルクラスで:

def before_save
  @was_a_new_record = new_record?
  return true
end

def after_save
  if @was_a_new_record
    ...
  end
end
于 2011-02-12T00:58:24.150 に答える
30

タイムスタンプを持っている人のためのさらに別のオプション:updated_at

if created_at == updated_at
  # it's a newly created record
end
于 2013-02-05T00:28:32.247 に答える
23

レコードが保存された後after_create、レコードが新しいレコードである場合にのみ呼び出されるコールバックがあります。これが変更および保存された既存のレコードである場合に使用するコールバックもあります。コールバックは、どちらの場合も、 または が呼び出された後に呼び出されます。after_updateafter_saveafter_createafter_update

after_create新しいレコードが保存された後に何かを行う必要がある場合に使用します。

詳細はこちら: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

于 2012-11-28T21:25:05.007 に答える
18

オブジェクトは既に保存されているため、以前の変更を確認する必要があります。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)

どちらもかなり醜いですが、オブジェクトが新しく作成されたかどうかを知ることができます。それが役立つことを願っています!

于 2013-09-15T17:36:57.233 に答える
1

previously_new_record?まさにこのユースケースのために呼び出されるメソッドがあります。

user = User.new

user.new_record? # => true
user.previously_new_record? # => false

user.save

user.new_record? # => false
user.previously_new_record? # => true

ソース: https://api.rubyonrails.org/v6.1.4/classes/ActiveRecord/Persistence.html#method-i-previously_new_record-3F

呼び出しによる提案された回避策がsaved_change_to_id?機能しなくなったようです。私はRails 7を使用しています。

于 2022-01-05T07:27:45.977 に答える