私は既存の Rails プロジェクトに慣れてきており、モデル (ActiveRecord) の特定の属性 (フィールド) がどこで変更されているのか疑問に思っています。Java では、セッターで Eclipse の「参照の検索」機能を使用するか、そこにブレークポイントを設定します。ActiveRecord では、属性はクラス ファイルにリストされていません。もちろん、テキスト検索を実行して何百もの結果を調べることはできますが、これは IDE で作業するポイントに反します。より良い方法はありますか?RubyMine を使用しています。
2 に答える
tl;dr
Kernel.caller
説明
Rails は method_missing を使用して ActiveRecord モデルに属性メソッドを実装します。これは ActiveRecord::Base ソース コードで確認できます。モデルクラス YourModel でこの問題にアプローチする方法は次のとおりです。
class YourModel < ActiveRecord::Base
def myfield=(*args)
Rails.logger.debug "myfield called at #{Kernel.caller.inspect}"
super(*args)
end
end
update_attribute や friends など、属性を更新する方法は他にもいくつかあります。割り当て呼び出しサイトが見つからない場合は、コードで使用されているメソッドが見つかるまでメソッドをオーバーライドし続けることができます。または、gem のローカル コピーで ActiveRecord::Base を変更することもできます ("bundle show activerecord" はそのパスを示します)。
RubyMine には、Eclipse のような検索参照機能があります。ただし、AR は多くのメタプログラミングを使用するため、Rails ソースをナビゲートするのにはあまり役に立ちません。検索結果を確認するときは、「send」を使用する行と、関数への裸の呼び出しを確認する必要があります。
もう 1 つ注意する必要があるのは、AR は実行時にコードを合成するということです。探しているメソッドがソースに存在しない場合もあります。