在我的模型中,我试图动态地将数组内的对象作为顶级属性公开。这是代码片段:
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的值,以便它与正确的索引相关联?
答案 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