ActiveRecord モデルの機能を拡張するモジュールを作成しています。
これが私の初期設定です。
私のクラス:
class MyClass < ActiveRecord::Base
is_my_modiable
end
そしてモジュール:
module MyMod
def self.is_my_modiable
class_eval do
def new_method
self.mod = true
self.save!
end
end
end
end
ActiveRecord::Base(extend,MyMod)
私が今やりたいことはnew_method
、ブロックを渡すことによって の機能を拡張することです。このようなもの:
class MyClass < ActiveRecord::Base
is_my_modiable do
self.something_special
end
end
module MyMod
def self.is_my_modiable
class_eval do
def new_method
yield if block_given?
self.mod = true
self.save!
end
end
end
end
これは機能しませんが、理にかなっています。class_eval では、new_method は実行されておらず、定義されているだけなので、yield ステートメントは、メソッドが実際に呼び出されるまで実行されません。
ブロックを class_eval 内のクラス変数に割り当て、メソッド内でそのクラス変数を呼び出そうとしましたが、ブロックをメソッドに渡さなくても、すべての is_my_modiable モデルでブロックが呼び出されていました。
同じ効果を得るためにメソッドをオーバーライドするだけかもしれませんが、もっとエレガントな方法があることを願っています。