Как я могу сделать JSON-ответ от хэша, сохраняя порядок в ruby ​​на рельсах? - PullRequest
2 голосов
/ 10 февраля 2010

Я не могу дать ответ json в ruby ​​на рельсах из хэш-структуры данных названий стран с их кодами стран: {"AF" => "Афганистан", "AL" => "Албания", "DZ "=>" Алжир ", ...}, так что ответ json имеет свои записи в алфавитном порядке следующим образом:

{"AF": "Афганистан", "AL": "Албания", "DZ" => "Алжир" ...}

Насколько я понимаю, проблема в том, что рубиновый хеш сам по себе не имеет понятия порядка. поэтому ответ совершенно случайный.

спасибо за любую помощь!

мартин

Ответы [ 3 ]

4 голосов
/ 10 февраля 2010

Вы можете использовать ActiveSupport::OrderedHash

Пример дела:

hash = ActiveSupport::OrderedHash.new
hash["one"] = "one"
hash["two"] = "two"
hash["three"] = "three"
p hash            # Will give you the hash in reverse order
p hash.to_json    # Will give you a json with the ordered hash
0 голосов
/ 10 февраля 2010

благодаря предыдущим ответам (-> westoque) я закончил с тем, чтобы обезопасить патч Hash Class в папке инициализаторов rails, вот так:

class Hash
 def to_inverted_ordered_hash
  copy = self.dup.invert.sort
  copy.inject(ActiveSupport::OrderedHash.new) {|hash, i|  hash[i[1]] =  i[0]; hash}
 end

 def to_ordered_hash
  copy = self.dup.sort
  copy.inject(ActiveSupport::OrderedHash.new) {|hash, i|  hash[i[1]] =  i[0]; hash}
 end
end

и вызывается to_json при визуализации с контроллера. Большое спасибо!

0 голосов
/ 10 февраля 2010

Как насчет массива хэшей, например:

[{ "AF"=>"Afghanistan"}, {"AL"=>"Albania"}, {"DZ"=>"Algeria"}, ... ]
...