Rails has_many被​​包含的模块覆盖

时间:2011-07-09 06:50:25

标签: ruby-on-rails ruby include

我有一个看起来像这样的模型,#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方法覆盖?

1 个答案:

答案 0 :(得分:2)

Ruby的方法查找在当前类中开始,如果找不到匹配项,则查找包含的模块和超类(IIRC,它查找元类,然后是模块,然后是超类,然后是超类元类等)。因此,当您在类中定义方法时,您将覆盖,但是当您在模块中定义方法时,它不会被查找。

为了覆盖该方法,您应该在模块内部undef :friendsalias :old_friends :friends(以便原始方法仍然可用)。最好在模块的self.included方法

中进行