ruby-on-rails - 如何从字符串转换为对象属性名称?

标签 ruby-on-rails ruby attributes

我正在尝试将字符串值转换为属于对象的属性名称。例如,在下面的代码中,我需要将 column_array 中的所有字符串值转换为属性名称。名称 "student_identification""email" 等是我的 Student 表的实际列名。在实际场景中,column_array 将由用户设置(通过勾选复选框)。 new_array 将替换为 csv,因为我希望数据进入 csv 文件。

此刻我真的在以下几行挣扎:

   new_array << r."#{column_array[i]}"

我希望将 "#{column_array[i]}" 转换为属性名称,以便我可以访问数据。

def exp_tst

  @records =  Student.find(:all, :conditions=> session[:selection_scope],
                                 :order => sort_order('laboratory_id'))

  column_array = ["student_identification", "laboratory_id", "email", "current_status"]

  new_array = Array.new()

  @records.each do |r|

    (0..(column_array.size-1)).each do |i|
       new_array << r."#{column_array[i]}"
    end
  end

end

最佳答案

举个例子,假设column_array[i] = "foo"

如果你想调用方法 r.foo,使用Object#send:

 r.send(column_array[i], arg1, arg2, arg3, ...)

如果你想访问r的实例变量@foo,使用Object#instance_variable_getObject#instance_variable_set:

 r.instance_variable_get('@'+column_array[i])
 r.instance_variable_set('@'+column_array[i], new_value)

在这种情况下,我们必须在给定名称前添加一个 @ 标记,因为在所有实例变量名称的开头都需要这样做。

因为这是 rails,而且你的模型有很多 ActiveRecord 魔法(我猜 StudentActiveRecord 的子类::Base) 你可能想使用前者,因为 ActiveRecord 创建了访问数据库的方法,而存储在实例变量中的值可能不是你想要或期望的。

我将使用我手头的一些测试数据中的示例:

% script/console
Loading development environment (Rails 2.3.2)
irb> Customer
#=> Customer(id: integer, date_subscribed: datetime, rental_plan_id: integer, name: string, address: string, phone_number: string, credit_limit: decimal, last_bill_end_date: datetime, balance: decimal)
irb> example_customer = Customer.find(:all)[0]
#=> #<Customer id: 6, date_subscribed: "2007-12-24 05:00:00", rental_plan_id: 3, name: "Evagation Governessy", address: "803 Asbestous St, Uneradicated Stannous MP 37441", phone_number: "(433) 462-3416", credit_limit: #<BigDecimal:191edc0,'0.732E3',4(12)>, last_bill_end_date: "2009-05-15 04:00:00", balance: #<BigDecimal:191e870,'0.743E3',4(12)>>
irb> example_customer.name
#=> "Evagation Governessy"
irb> field = 'name'
#=> "name"
irb> example_customer.instance_variable_get(field)
NameError: `name` is not allowed as an instance variable name
from (irb):8:in `instance_variable_get`
from (irb):8
irb> example_customer.instance_variable_get('@'+field)
#=> nil
irb> example_customer.send(field)
#=> "Evagation Governessy"
irb> example_customer.send(field+'=', "Evagation Governessy Jr.")
#=> "Evagation Governessy Jr."
irb> example_customer.send(field)
#=> "Evagation Governessy Jr."
irb> example_customer.name
#=> "Evagation Governessy Jr."

因此您可以看到#send(field) 是如何访问记录信息的,而尝试访问属性却没有。 另外,我们可以使用#send(field+'=')来更改记录信息。

关于ruby-on-rails - 如何从字符串转换为对象属性名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/903763/

相关文章:

ruby-on-rails - form_for rails 4中的参数数量错误

ruby-on-rails - 为 ruby​​onrails 编写测试

ruby-on-rails - rails : Paper Clip Cropping Syntax

ruby - 遍历页面对象的所有元素

javascript - Firefox 不显示 'title' 属性

java - 如何在 JSP (Struts2) 中访问动态属性

ruby-on-rails - 验证属性的长度(如果存在)

ruby-on-rails - Date.today 和 Date.yesterday 相同但在控制台中不同

javascript - 使用JavaScript进行代码依赖来选择RESTful

html - CSS:调用具有相同属性的任何元素