Ruby:如何干掉类似的模型属性调用

nee*_*zer 2 ruby attributes models

我有一个User模型,其中包含许多非常相似的属性,我想列出而不单独输入每个属性.

所以,而不是:

"eye color: #{@user.his_eye_color}"
"hair color: #{@user.his_hair_color}"
"height: #{@user.his_height}"
"weight: #{@user.his_weight}"
...

"eye color: #{@user.her_eye_color}"
"hair color: #{@user.her_hair_color}"
"height: #{@user.her_height}"
"weight: #{@user.her_weight}"
...
Run Code Online (Sandbox Code Playgroud)

我想做一个块或什么的(Proc?Lambda?仍然不清楚它们是什么......):

['eye color','hair color','height','weight',...].do |stat|
   "#{stat}: #{@user.her_(stat.underscore)}"
end

['eye color','hair color','height','weight',...].do |stat|
   "#{stat}: #{@user.his_(stat.underscore)}"
end
Run Code Online (Sandbox Code Playgroud)

我知道我上面写的是神秘的,神奇的,完全错误的(@user.his_(stat.underscore)部分),但是我能做到这一点是什么意思呢?我基本上需要动态调用我的Model的属性,但我不确定如何做到这一点......

任何帮助将非常感激!

MBO*_*MBO 5

['eye color','hair color','height','weight',...].do |stat|
   "#{stat}: #{ @user.send(:"her_#{stat.tr(" ","_")}") }"
end

['eye color','hair color','height','weight',...].do |stat|
   "#{stat}: #{ @user.send(:"his_#{stat.tr(" ","_")}") }"
end
Run Code Online (Sandbox Code Playgroud)

这应该工作.您始终可以使用send对象调用方法,并将该方法名称动态生成为字符串

  • 如果没有别的,`stat`是一个字符串,所以你总是可以使用`stat.tr('','_')`来转换它们,如果你不能让`.underscore`工作的话. (2认同)