将值绑定到ruby define_method

时间:2016-01-26 22:32:14

标签: ruby-on-rails ruby

在我的模型中,我试图动态地将数组内的对象作为顶级属性公开。这是代码片段:

class Widget < ActiveRecord::Base
  # attr_accessor :name
end

class MyModel < ActiveRecord::Base
  has_many :widgets
  #attr_accessor :widgets

  after_initialize :init_widgets

  def init_widgets
    widgets
    widgets.each_with_index do |widget, index|
      define_method(widget.name) do
        widgets[index]
      end
    end
  end
end

有没有办法让我在我创建的新方法中定义index的值,以便它与正确的索引相关联?

2 个答案:

答案 0 :(得分:0)

我可能会创建一个重载[]运算符的访问器/赋值方法:

class BracketOperator
  def initialize
    @values = (1..100).to_a
  end

  def [](index)
    @values[index]
  end

  def []=(index, value)
    @values[index] = value
  end
 end

 bo = BracketOperator.new
 bo[3] # => 4
 bo[3] = 17
 bo[3] # => 17

答案 1 :(得分:0)

所以作为参考,这是我想出的答案。显然我不太了解红宝石的范围。变量n以某种方式仍然引用每个循环中的n。因此,对于我原来的问题,我可以在方法中使用index变量,它将映射到我期望它映射到的内容。

 class Test
   def setup
     names = [ "foo","bar" ] 
     names.each do |n|
       self.class.send :define_method, n do
         puts "method is called #{n}!"
       end
     end
   end
 end