2009-05-24 183 views
18

我想将字符串值转换为属于一个对象的属性的名称。例如,在下面的代码中,我需要将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 
+0

`(0 ..(column_array.size -1))。每个`可以用`column_array.each_index`替换。 – 2012-01-11 21:49:24

回答

39

举个例子,比方说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) 

在在这种情况下,我们必须在@ sigil上预先给定名称,因为这是在所有实例变量名称的开始。

由于这是铁轨,而且有一大堆的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+'=')更改记录信息。

+0

嗨, 是学生是'ActiveRecord :: Base'的子类 class Student Vicer 2009-05-24 13:53:40

4

看instance_eval的方法...

,如果你有 '属性',需要做

object.attribute = 'ololo' 

你可以这样做:

object.instance_eval('attribute') = 'ololo' 
相关问题