Мои хэши неупорядочены. Что такое цикл, который может выбирать их по их хэш-идентификатору? - PullRequest
0 голосов
/ 01 февраля 2011

Мои хеши выглядят так:

{"6"=>{":amount_paid"=>"100.00", ":date_paid"=>"4/22/2009"},
 "0"=>{":amount_paid"=>"100.00", ":date_paid"=>"2/27/2008"},
 "1"=>{":amount_paid"=>"80.00", ":date_paid"=>"3/27/2008"},
 "2"=>{":amount_paid"=>"100.00", ":date_paid"=>"5/8/2008"},
 "3"=>{":amount_paid"=>"100.00", ":date_paid"=>"6/20/2008"},
 "4"=>{":amount_paid"=>"100.00", ":date_paid"=>"9/22/2008"},
 "5"=>{":amount_paid"=>"100.00", ":date_paid"=>"2/20/2009"}}

Порядок имеет значение для меня, когда я повторяю его с этим:

params[:payments].each_with_index do |item, idx|

Таким образом, я могу добавить датыкакая дата когда-либо предшествовала им.

Есть ли цикл, который мог бы найти последовательность "0".."6" и оставаться близким к тому же синтаксису?

Единственная другая альтернатива, о которой я могу подумать, этоубедитесь, что эти параметры сложены в порядке.Они приходят из такой формы:

= text_field_tag "payments[0][:date_paid]"
= text_field_tag "payments[0][:amount_paid]"
= text_field_tag "payments[1][:date_paid]"
= text_field_tag "payments[1][:amount_paid]"
= submit_tag 'punch it chewy!'

Ответы [ 5 ]

2 голосов
/ 01 февраля 2011

Хэши неупорядочены в Ruby 1.8, и упорядочены путем вставки в Ruby 1.9.Вы можете отсортировать ваш хэш по ключу, используя Enumerable # sort , как показано в этой теме .Получается не Hash, а массив массивов с первым элементом в качестве ключей и вторым в качестве значений.Вам нужно будет распаковать их, чтобы получить то, что вы хотите, похожий на each_with_index.

params[:payments].sort { |a, b| a[0].to_i <=> b[0].to_i }.each do |x|
  item = x[1]
  index = x[0]
  .....
end
1 голос
/ 01 февраля 2011
sorted_payments = params[:payments].keys.sort.map {|k| params[:payments][k]}

возвращает массив хэшей, упорядоченный по значению ключей, который затем можно перечислить с помощью .each.Это более обобщенно, чем выполнение (0..6), что может (или не может) быть полезным.

1 голос
/ 01 февраля 2011

Хеши неупорядочены. Существует драгоценный камень с именем facets, у которого есть упорядоченный объект словаря.

Вы также можете преобразовать хеш в массив и затем отсортировать массив.

thing = {"1" => {:paid => 100, :date => '1/1/2011'}, "2" => {:paid => 100, :date => '1/12/2011'}}
thing.to_a.sort
thing.inspect

возвращает: [["1", {: date => "01.01.1900",: paid => 100}], ["2", {: date => "01.01.1900", : платный => 100}]]

Затем вы можете перебрать массив в правильном порядке.

1 голос
/ 01 февраля 2011

Синтаксис схожий:

(0..6).each do |idx| item=params[:payments][idx]
   # ...
end

Hash, по-видимому, сохраняет ключи в порядке их вставки (http://www.ruby -doc.org / core / classes / Hash.html ), поэтому вы можете воссоздать отсортированный хэш следующим образом:

Hash[params[:payments].sort]

(очевидно, начиная с Ruby 1.9.2; возможно, не во всех реализациях)

0 голосов
/ 01 февраля 2011
(0..6).each do |idx|
  item = params[:payments][idx]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...