Ruby属性元编程

时间:2013-09-30 07:19:16

标签: ruby-on-rails ruby

我的user具有以下属性:

:step1_local
:step2_local
:step3_local
...
...
:local1
:local2
:local3

我想根据同一模型上的另一组属性更改属性值。我想在user上做一些处理映射,比如说:

def magic (user)
   user.local(1..3) = process(user.step(1..3)_local)
end

上面的代码当然不起作用(例子)。我不确定如何动态地做它而不单独检查每个属性。我想将处理映射到另一个。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用Object#public_send和方法,如下所示:

def magic(user)
  (1..3).each do |n|
    user.public_send("local#{n}=", process(user.read_attribute("step#{n}_local")))
  end
end