Як конвертувати результати ActiveRecord в масив хешей


112

У мене є результат ActiveRecord операції пошуку:

tasks_records = TaskStoreStatus.find(
  :all,
  :select => "task_id, store_name, store_region",
  :conditions => ["task_status = ? and store_id = ?", "f", store_id]
)

Тепер я хочу перетворити ці результати в масив хешів на зразок цього:

[0] ->  { :task_d => 10, :store_name=> "Koramanagala", :store_region=> "India" }

[1] -> { :task_d => 10, :store_name=> "Koramanagala", :store_region=> "India" }

[2] ->  { :task_d => 10, :store_name=> "Koramanagala", :store_region=> "India" }

щоб я міг перебирати масив і додавати більше елементів до хешів і пізніше конвертувати результат у JSONмій відповідь API. Як я можу це зробити?


Дивіться також stackoverflow.com/q/20794398/165673
Ярін

Відповіді:


210

as_json

Ви повинні використовувати as_jsonметод, який перетворює об’єкти ActiveRecord в Ruby Hashes, незважаючи на його ім'я

tasks_records = TaskStoreStatus.all
tasks_records = tasks_records.as_json

# You can now add new records and return the result as json by calling `to_json`

tasks_records << TaskStoreStatus.last.as_json
tasks_records << { :task_id => 10, :store_name => "Koramanagala", :store_region => "India" }
tasks_records.to_json

serializable_hash

Ви також можете конвертувати будь-які об’єкти ActiveRecord в Hash з serializable_hashі ви можете конвертувати будь-які результати ActiveRecord в масив з to_a, наприклад, для вашого прикладу:

tasks_records = TaskStoreStatus.all
tasks_records.to_a.map(&:serializable_hash)

І якщо ви хочете потворне рішення для Rails до версії v2.3

JSON.parse(tasks_records.to_json) # please don't do it

4
+1 За те, що я пропоную serializable_hash - це перший раз, коли я коли-небудь стикався з відповіддю, яка згадує це. На жаль, я зараз використовую останнє рішення JSON, але зараз я розгляну використання serializable_hash. Мені просто потрібно з'ясувати, як включити ім'я класу до кожного запису, як ви могли отримати, якщо ви включите root у JSON.
Дом

@Dom 웃 Якщо я правильно зрозумів подивитися: stackoverflow.com/questions/17090891 / ...
hdorio

@Дом дивіться мою відповідь нижче.
Фредрік Е

Ще один можливий спосіб tasks_records = TaskStoreStatus.all.map(&:attributes).
Риго

Дійсно великі рішення тут, але моє запитання може бути Які переваги використання або .as_json, &:serializable_hashа &:attributes? Це пов'язано з помічниками ActiveRecord або безпосередньо з продуктивністю? заздалегідь дякую, хлопці! @Dom @Rigo @Fredrik E
alexventuraio

35

Може бути?

result.map(&:attributes)

Якщо вам потрібні клавіші символів:

result.map { |r| r.attributes.symbolize_keys }

9

Для поточного ActiveRecord (4.2.4+) існує метод to_hashна Resultоб'єкті, який повертає масив хешів. Потім ви можете нанести на нього карту та перетворити на символізовані хеші:

# Get an array of hashes representing the result (column => value):
result.to_hash
# => [{"id" => 1, "title" => "title_1", "body" => "body_1"},
      {"id" => 2, "title" => "title_2", "body" => "body_2"},
      ...
     ]

result.to_hash.map(&:symbolize_keys)
# => [{:id => 1, :title => "title_1", :body => "body_1"},
      {:id => 2, :title => "title_2", :body => "body_2"},
      ...
     ]

Докладнішу інформацію див . У Документах ActiveRecord :: Результати .


Не може бути простішим і зрозумілішим за це. Велике спасибі.
WM

1
Примітка, якщо ваша версія ActiveRecord не розпізнає to_hashметод: спробуйте to_aryнатомість. Дивно це працювало для мене.
Філ-
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.