动态方法调用Rails关联

时间:2016-01-13 14:17:51

标签: ruby-on-rails ruby

给出这样的数组:

%w{ field_one, field_two, some_association.field_one }

我需要对此进行迭代并在给定对象上动态调用这些方法,完全如下所述:Ruby send method with rails associations

到目前为止,我有这个,它确实正确地获取值:

field.include?('.') ? field.split('.').inject(some_object, :send) : some_object.send(field)

此外,我需要在正确的类上调用:human_attribute_name来生成标签。什么是干净的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

目前尚不清楚你要完成什么,但如果我不得不猜测我会说你正在尝试制作某种CMS或报告系统,其中显示的数据的定义可以通过用户界面。有这样的宝石,但看到你正在这条轨道上......

用:human_attribute_name我假设你的意思是要在页面上显示的友好名称作为标签。首先,使用字符串而不是符号更合适,因为您可以使用空格和更多字符。假设您从不打算在同一网页上有重复的标签名称,您可以尝试使用哈希而不是数组。

fields = { 
           "Field One" => "field_one" ,
           "Field Two" => "field_two" ,
           "Field One Of Some Association" => "some_association.field_one"
         }

然后以与您引用的答案中显示的方式类似的方式获取数据。

data = {}

fields.each_pair do | friendly_name, attribute |
  data[friendly_name] = if attribute.include?('.')
    attribute.split('.').inject(some_object, :send)
  else
    some_object.send(attribute)
  end
end

这应该留给你一个哈希,你可以像你一样在你的视图中循环

{ 
  "Field One" => "Mr" ,
  "Field Two" => "Data",
  "Field One Of Some Association" => "A Friend Of Mr Data"
}