これを行う方法は 3 つありますが、どれも満足のいくものではありませんが、少なくとも 2 つは確実に機能します。
A) 使用する属性が欠落している場合に返す
def after_find
# What a flaky way to ruin your code:
return unless self.has_attribute?(:some_attrib_your_model_uses_in_after_find)
@amazing_pain = @some_attrib_your_model_uses_in_after_find + 1
end
B) コールスタック全体を grep する
(そして、存在することを祈りますか?あなたがそう思うので、そこにあります)
これをオプションとして投稿するのは恥ずかしいですが、 で使用できる文字列の配列で何ができるかを見るのは良いことですcaller
。caller
フォーマットが変更されないことを願いましょう。
コンソールから 2.3.15 を使用すると、モデルの after_find() へのコールスタックは次のようになります。
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.15/lib/active_record/callbacks.rb:347:in `send'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.15/lib/active_record/callbacks.rb:347:in `callback'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.15/lib/active_record/base.rb:1687:in `send'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.15/lib/active_record/base.rb:1687:「インスタンス化」
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.15/lib/active_record/base.rb:665:`find_by_sql'内
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.15/lib/active_record/base.rb:665:in `collect!' で
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.15/lib/active_record/base.rb:665:`find_by_sql'内
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.15/lib/active_record/base.rb:1582:`find_every' 内
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.15/lib/active_record/base.rb:1539:`find_initial' 内
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.15/lib/active_record/base.rb:696:「存在しますか?」
(irb):2:in `irb_binding'
/usr/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'
/usr/lib/ruby/1.8/irb/workspace.rb:52
C) モデルを Eager-Load にする
2.3.15 ActiveRecord README がそれを示唆しているので、これをやりたいと思う人もいるかもしれません:
after_find :eager_load, 'self.class.announce(#{id})'
必要以上に DB に負担をかけたくありません。多くの場合の呼び出しのポイントはexists?
、単純な単一列のルックアップを行うことです。exists?
呼び出しを行うためだけに、モデル全体と、場合によってはその関連付けの熱心な読み込みを実行すると、パフォーマンスが低下します。