在返回超类对象的自定义类中链接方法



我有以下类定义

class Map < Array
def find_all_activerecord
  self.find_all { |element| element.class.superclass == ActiveRecord::Base }
end
def find_all_family_nil
  find_all { |element| element.try(:family) == nil }
end
def find_all_parents
  self.find_all_activerecord.find_all_family_nil
end
end

我可以做以下操作

@map = Map.new
@map.find_all_activerecord
@map.find_all_family_nil

但当我尝试

@map.find_all_parents

我得到未定义方法'find_all_family_nil'在[]:Array上的错误

我明白发生了什么事。自定义方法返回数组对象,方法定义在Class::Map 上。

如何在自定义类上创建自定义方法,这些方法可以返回更高类的对象,并且能够链接它们


我遇到的另一个问题是改变类如果
   @map = Map.new
然后

   @map = @map + [1,2,3]
   @map.class # => Array

为什么会发生这种情况,应该做什么,这是哪个研究领域

正如您可能已经想到的,您的find_all方法在应该返回Map对象时返回Array对象。

我能想到的一个修复方法是:

class Map < Array
  def find_all(&block)
    self.class.new(super(&block))
  end
end

最新更新