我有一个看起来像这样的模型,#friend方法会覆盖关联生成的方法#friends:
class User < ActiveRecord::Base
has_many :friends
def friends
puts 'hi'
end
end
但是当我重构我的代码看起来像这样时,关联生成的方法#friends不会被包含的朋友模块覆盖:
module User
module Friends
def friends
puts 'hi'
end
end
end
require 'user/friends'
class User < ActiveRecord::Base
has_many :friends
include User::Friends
end
为什么关联生成的#friends不会被包含的User :: Friends #friends方法覆盖?
答案 0 :(得分:2)
Ruby的方法查找在当前类中开始,如果找不到匹配项,则查找包含的模块和超类(IIRC,它查找元类,然后是模块,然后是超类,然后是超类元类等)。因此,当您在类中定义方法时,您将覆盖,但是当您在模块中定义方法时,它不会被查找。
为了覆盖该方法,您应该在模块内部undef :friends
或alias :old_friends :friends
(以便原始方法仍然可用)。最好在模块的self.included
方法