2015-08-10 3 views
2

Проблема в том, что у меня есть эти параметры:Как объявить многомерный массив с ключами в рубин

Parameters: {"multi_fees_transaction"=>{"amount"=>"20.00", "student_id"=>"5", "transaction_date"=>"2015-08-10", "payment_note"=>"", "payment_mode"=>"Cash"}, 
    "transactions"=>{"2"=>{"amount"=>"10", "finance_id"=>"4", "payee_id"=>"5", "category_id"=>"14", "payee_type"=>"Student", "transaction_date"=>"2015-08-10", "title"=>"Receipt No.. (Multiple Fees) F4", "finance_type"=>"FinanceFee", "payment_mode"=>"Cash", "payment_note"=>""}, 
     "1"=>{"amount"=>"10", "finance_id"=>"4", "payee_id"=>"2", "category_id"=>"14", "payee_type"=>"Student", "transaction_date"=>"2015-08-10", "title"=>"Receipt No.. (Multiple Fees) F4", "finance_type"=>"FinanceFee", "payment_mode"=>"Cash", "payment_note"=>""}}, 
     "controller"=>"parent_wise_fee_payments", "authenticity_token"=>"tvgD1IXP14h1dtsAjgqaS5o5reRXTPzjCPRVrwPc9Vg=", "transaction_date"=>"2015-08-10", "action"=>"pay_all_fees"} 

И мне нужно, чтобы создать что-то вроде этого:

params[:transactions].each do |trans| 
     multi_fees["amount"]=trans["amount"] 
     multi_fees["student_id"]=trans["payee_id"] 
     multi_fees["transaction_date"]=trans["transaction_date"] 
     multi_fees["payment_note"]=params[:multi_fees_transaction]["payment_note"] 
     multi_fees["payment_mode"]=params[:multi_fees_transaction]["payment_mode"] 
end 

Это дает ошибку потому что мне нужно определить массив multi_fees. Но я просто не мог найти способ сделать это. Не могли бы вы мне помочь?

+0

Ruby не имеет многомерных массивов. И то, что вы показываете, не является массивом, многомерным или иным. Вы можете уточнить свой вопрос, пожалуйста? –

ответ

2

Это может быть сделано с помощью Enumerable#map (хэша является объектом перечислимого):

multi_fees = params[:transactions].values.map do |trans| 
    { 
    "amount" => trans["amount"], 
    "student_id" => trans["payee_id"], 
    "transaction_date" => trans["transaction_date"], 
    "payment_note" => trans["payment_note"], 
    "payment_node" => trans["payment_node"], 
    } 
end 

Блок передается #Map вызывается для каждого значения в Params [: сделок] хэш. Значением блока является хэш. Хеши, возвращаемые всеми вызовами блока, объединяются в массив, который присваивается multi_fees.

+0

Спасибо, что так много :) –

+1

Раба, если вы не понимаете, что означает Уэйн, «хеш - это перечислимый объект», он говорит, что 'class Hash ... end' содержит' include Enumerable', что делает все методы в модуле «Enumerable» доступны для объектов «Hash». –

1
multi_fees = params['transactions'].values.map do |h| 
    h.select { |k, _| # select from respective transaction 
    ['amount', 'payee_id', 'transaction_date'].include? k 
    }.merge params['multi_fees_transaction'].select { |k, _| # select globally 
    ['payment_note', 'payment_mode'].include? k 
    } 
end 

Идея заключается в том, чтобы объединение сопоставляются результаты с глобально выбраны:

#⇒ [ 
# [0] { 
#    "amount" => "10", 
#   "payee_id" => "5", 
#  "payment_mode" => "Cash", 
#  "payment_note" => "", 
# "transaction_date" => "2015-08-10" 
# }, 
# [1] { 
#    "amount" => "10", 
#   "payee_id" => "2", 
#  "payment_mode" => "Cash", 
#  "payment_note" => "", 
# "transaction_date" => "2015-08-10" 
# } 
# ] 
+0

Спасибо, это очень помогает :) –

0

Кроме того, будьте осторожны с формулировкой. multi_fees не является массивом. Это хэш.

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