是否可以动态调用属性?

时间:2018-07-08 18:45:12

标签: ruby-on-rails ruby attributes

假设我有一个模型name,具有任意数量的属性,包括person.name = "Jake" attr = "name" puts person.attr => "Jake" 。通过使用变量指定属性可以动态选择要调用的属性吗?像这样:

if attr == "name"
  puts person.name
elsif attr == "height"
  puts person.height
  ...

我可以使用这样的条件语句来做到这一点:

platformBrowserDynamic().bootstrapModule(AppModule);

但这似乎效率很低。

2 个答案:

答案 0 :(得分:3)

如果您使用的是ActiveRecord,则可以使用[]来获取属性。

person = Person.last
attr = "height"
puts person[attr]

但这仅适用于Person.columns_hash中的属性,不适用于关联之类的东西。

为此,您需要使用public_send,例如

person = Person.last
attr = 'height'
puts person.public_send(attr.to_sym)

如果要允许用户选择这是什么属性,则需要将其列入白名单,以便某人不会attr = params[:attribute]并致电?attribute=destroy并销毁一条记录。除非您希望他们...:)

答案 1 :(得分:2)

尝试person.send(:height)。它打开了元编程的全新世界,是吧?