1

在rails中,如果我想覆盖一个属性方法,例如。一个 setter 或 getter 等,我可能需要定义实例方法。

但是,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 回答