2011-01-29 3 views
0

Не уверен, что это не работает.Как вы называете индекс в .each_with_index

>> params[:payments] 
{"0"=>{":amount_paid"=>"80.00", ":date_paid"=>"2/27/2008"}, "1"=>{":amount_paid"=>"100.00", ":date_paid"=>"5/8/2008"}} 

Так что я могу назвать конкретный объект с этим:

>> params[:payments][:"1"] 
    {":amount_paid"=>"100.00", ":date_paid"=>"5/8/2008"} 

Но если я это пишу ..

>> params[:payments].each_with_index{|item, idx| item[:"#{idx}"]} 
TypeError Exception: Symbol as array index 

идеалистически, я хочу сделать это:

params[:payments].each_with_index do |item, idx|  
    @calc.payments[idx][:date_paid] = item[:"#{idx}"][":amount_paid"] 
    @calc.payments[idx][:amount_paid] = (item[:"#{idx}"][":amount_paid"]).to_f 
end 

Обновление:

На основании некоторых ответов, I'ved попытался это:

params[:payments].each{|k,v| @calc.payments[k.to_i] = v[":amounts_paid"]} 

Это превращает @calc.payments в:

nil 
nil 

Резервное копирование хотя, другие, похоже на работу ..

>> params[:payments].each{|k,v| p v[":amount_paid"]} 
"80.00" 
"100.00" 

И этот ...

>> params[:payments].each{|k,v| p @calc.payments[k.to_i]} 
{:date_awarded=>"1/2/2008", :judgement_balance=>1955.96} 
nil 

Как я могу получить доступ к item[idx] в петле?

ответ

1
params[:payments].each do |k,v| 
    puts "Item %d amount=%s date=%s\n" % [k, v[":amount_paid"], v[":date_paid"]] 
end 
Item 0 amount=80.00 date=2/27/2008 
Item 1 amount=100.00 date=5/8/2008 

Update:

Хорошо, хорошо, вот полная программа .. сценарий .. что вы можете реально работать. Поскольку вы пытаетесь понять Ruby, я думаю, вы должны работать с ним за пределами Rails в течение нескольких минут. Я издевался над @calc.payments, что бы это ни было. Этот код будет работать и, по-видимому, сделает то, что вы хотите.

require 'pp' 
(params = {})[:payments] = {"0"=>{":amount_paid"=>"80.00", ":date_paid"=>"2/27/2008"}, "1"=>{":amount_paid"=>"100.00", ":date_paid"=>"5/8/2008"}} 
pp params 
class T; attr_accessor :payments; end 
(@calc = T.new).payments = [] 
params[:payments].each do |k,v| 
    i = k.to_i 
    @calc.payments[i] ||= {} 
    @calc.payments[i][:date_paid] = v[":date_paid"] 
    @calc.payments[i][:amount_paid] = v[":date_paid"].to_f 
end 
pp @calc.payments 

Если вы запустите его, вы должны увидеть:

{:payments=> 
    {"0"=>{":amount_paid"=>"80.00", ":date_paid"=>"2/27/2008"}, 
    "1"=>{":amount_paid"=>"100.00", ":date_paid"=>"5/8/2008"}}} 
[{:date_paid=>"2/27/2008", :amount_paid=>2.0}, 
{:date_paid=>"5/8/2008", :amount_paid=>5.0}] 
+0

Интересно, можно ли использовать эту переменную, которую вы использовали для записи параметров, над которыми я работаю выше. Это SQL? Никогда не видел этого раньше. – Trip

+0

Ничего себе, спасибо DigitalRoss! – Trip

0

Вы можете просто сделать это, чтобы получить доступ к значениям. Так как params[:payments] содержит хэш, то для каждого прохода key будут назначены «0», «1» и т. Д., А value будет присвоен хэш с amount_paid и date_paid.

params[:payments].each do |key, value| 
    amount_paid = value[":amount_paid"] 
    ... 
end 
+0

обновил мой ответ above..still, кажется, не работает .. – Trip

+0

Первая строка в вашем обновленном коде может понадобиться '.to_f' в конце 'v [": amount_paid "]' –

Смежные вопросы