Vic*_*cer 19 ruby attributes ruby-on-rails
我试图将字符串值转换为属于对象的属性的名称.例如,在以下代码中,我需要column_array转换为属性名称中的所有字符串值.名字"student_identification","email"等都是我的实际列名称Student表.在真实场景中,column_array将由用户设置(通过勾选复选框).并且new_array将被替换csv,因为我想要的数据进入一个CSV文件.
目前我真的在以下方面苦苦挣扎:
new_array << r."#{column_array[i]}"
Run Code Online (Sandbox Code Playgroud)
我想"#{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
Run Code Online (Sandbox Code Playgroud)
ram*_*ion 41
比方说column_array[i] = "foo",举一个例子.
如果要调用该方法 r.foo,请使用Object#send:
r.send(column_array[i], arg1, arg2, arg3, ...)
Run Code Online (Sandbox Code Playgroud)
如果要访问r的实例变量@foo,请使用Object#instance_variable_get和Object#instance_variable_set:
r.instance_variable_get('@'+column_array[i])
r.instance_variable_set('@'+column_array[i], new_value)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们必须在给定名称前加上一个@sigil,因为在所有实例变量名称的开头都需要它.
由于这是rails,并且ActiveRecord你的模型会有很多魔法(我猜测它Student是它的子类ActiveRecord::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."
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到如何#send(field)访问记录信息,并尝试访问属性.此外,我们可以#send(field+'=')用来更改记录信息.
看一下instance_eval方法...
如果您有“属性”并且需要做
object.attribute = 'ololo'
Run Code Online (Sandbox Code Playgroud)
你可以做:
object.instance_eval('attribute') = 'ololo'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23062 次 |
| 最近记录: |