Active Record类似于数组实例变量的功能

时间:2010-05-10 16:54:50

标签: ruby-on-rails ruby activerecord

我想编写一个模块,在数组实例变量上提供类似功能的活动记录。

使用它的例子是

x = Container.new
x.include(ContainerModule)
x.elements << Element.new
x.elements.find id

module ContainerModule
   def initialize(*args)
     @elements = []
     class << @elements
        def <<(element)
          #do something with the Container...
          super(element)         
        end

        def find(id)
          #find an element using the Container's id
          self
          #=> #<Array..>  but I need #<Container..>
        end
     end
     super(*args)
  end
end

问题是我需要这些方法中的Container对象。对self的任何引用都将返回Array,而不是Container对象。

有没有办法做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:1)

这样的事情对你有用吗?

class Container
  attr_accessor :elements

  def initialize
    @elements = ContainerElements.new
  end
end

class ContainerElements < Array

  def find_by_id(id)
    self.find {|g| g.id == id }
  end

end

所以我创建了一个容器类,以及一个继承自Array的ContainerElements,并添加了(特定的)find_by_id方法。 如果您确实想要将其称为find,则需要alias

示例代码为:

class ElemWithId
  attr_accessor :id
  def initialize(value)
    @id = value
  end
end

cc = Container.new
cc.elements << ElemWithId.new(1)
cc.elements << ElemWithId.new(5)

puts "elements = #{cc.elements} "
puts "Finding: #{cc.elements.find_by_id(5)} "

希望这会有所帮助......

答案 1 :(得分:0)

您最好的方法可能是使用Hash类,该类具有已经通过id查找的操作。特别是,fetch方法可能会帮助您。