1

レールでは、属性メソッドをオーバーライドしたい場合、たとえば. インスタンスメソッドを定義する必要があるかもしれません。

ただし、インスタンスが最初に同期されるまで、activerecord は属性メソッドを定義しません。

これは次の場所で確認できます。

class MyModel < ActiveRecord::Base
end

MyModel.attribute_methods_generated? # => false
MyModel.instance_method(:a_db_column)
  # => NameError Exception: undefined method `a_db_column' for class `MyModel'
MyModel.new # implicitly calls define_attribute_methods
# MyModel.define_attribute_methods # can also use this instead of MyModel.new
MyModel.attribute_methods_generated? # => true
MyModel.instance_method(:a_db_column)
#<UnboundMethod: MyModel(#<Module:0x000000030a20a0>)#__temp__>

define_attribute_methods早期に電話をかけることで発生する可能性のある問題はありますか? 次のようなことをしても:

class MyModel < ActiveRecord::Base
  define_attribute_methods 
  # is there any code here which might cause problems?
end
4

2 に答える 2

0

インスタンスメソッドを定義する必要があるのはなぜですか? 私が理解していることから、インスタンスメソッドを追加/オーバーライドしようとしているため、このメソッドを呼び出すdefine_attribute_methodsと、インスタンスが作成されてから呼び出されます。

間違っていたら教えてください。

于 2012-09-12T08:43:38.197 に答える
0

あなたが提供した情報から、モデルの ActiveRecord によって生成されたメソッドにパッチを適用したいようです。ActiveRecord のメソッド生成をトリガーする代わりに、define_attribute_methods にパッチを適用して、完了後にパッチ メソッドを呼び出してみませんか?

于 2012-09-12T10:44:15.543 に答える