2017-11-16 42 views
0

私のモデルではafter_findを使用していますが、場合によってはinを無効にしたい場合があります。 そして私はを使用しています。まだafter_findが動作していますが、ドキュメントではそれは次の方法でのみ動作すると言います。それはなぜそうですか?after_findを無効にする方法はありますか?

all 
first 
find 
find_by 
find_by_* 
find_by_*! 
find_by_sql 
last 

私のAPI(ブドウのフレームワーク)after_findコールバックは、あなたのwhereコールによって呼び出されていません

delete '/delete_user' do 
    user_id = params[:user_id] #authenticate_current_user! 
    @user_profile = ::UserProfile.where(user_id: user_id). 
    @user_profile.destroy_all 
end 
+0

どのドキュメントから情報を取得しましたか? [rails documentation](http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html)は、次のように言っています:* "ファインダで見つけられインスタンス化された各オブジェクトの' after_find'と 'after_initialize'コールバックがトリガされます"*。そして、 'find_by_ *'メソッドは、v4以降、コアレールから廃止/廃止され、レール5で完全に削除されました。 –

+0

コードを表示できますか? 「場合によっては無効にする」とはどういう意味ですか? 'after_find'を全く含まない、あなたの問題に対するより洗練された解決策がありそうです。 –

+0

http://guides.rubyonrails.org/active_record_callbacks.htmlをご覧ください。コードも追加しました。 –

答えて

0

です。あなたのdestroy_all呼び出しによって呼び出されています。 destroy_allは、各オブジェクト(およびその関連オブジェクト)をインスタンス化し、そのdestroyメソッドを1つずつ呼び出します。

あなたはすぐにすべてのUserProfileのオブジェクトを削除したい場合は、それらをインスタンス化(およびすべてコールバックをスキップ)することなく、あなたが呼び出すことができます。

UserProfile.where(user_id: user_id).delete_all 

destroy_all and delete_allの違いについての詳しい情報はで見つけることができますあなたが気に他のStackOverflowの上の答えが、違いは次のとおりです。

  1. それは、レコードのインスタンスを作成しません
  2. それは私はあなたがafter_findあなたがそれを使用している方法を使用しないことをお勧めします、それは任意のコールバック

を呼び出すことはありません関連オブジェクト

  • は削除されません。 lots of ways to skip callbacksでもalmost nobody uses after_findです。 (例えば、after_createと比較)

    after_findコールバックをスキップするオプションは制限されています。そのためにはbuilt-in Rails methodsはありません。あなたは、あなたが考え始めるために持っているような条件を使用している場合

    after_find :foo, if: -> { <some logic> } 
    

    :あなたは絶対にコールバックを維持する必要がある場合(上記のように除いて)、その後、あなたの最善の策は、コールバックの定義に条件を追加することですその変数がマルチスレッド環境でどのように読み込まれ、設定されているか、競合条件を作成せずに並行要求をどのように処理するのですか?説明した方法でafter_findを使用しない方がうまく処理できない醜いパスを送ります。

  • +0

    いいえ。**私のコンソールで、** where節を使用してみましたが、after_findが呼び出されています。例:User.where(id:2)はafter_findメソッドを呼び出します。 –

    +0

    @shahanahamzaそれはコンソールで実行しているからです。コンソールで 'UserProfile.where'を実行すると、' irb'が各レコードをインスタンス化して便利に表示できるようになります。 'irb'がレコードをインスタンス化すると、' after_find'コールバックがトリガーされます。これは、コンソールがレコードをインスタンス化して表示するためです。 – anothermh