Как преобразовать результаты 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!

Ответ 1

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 в Array с помощью 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

Ответ 2

Может быть?

result.map(&:attributes)

Если вам нужны символы:

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

Ответ 3

В ответ на комментарий Dom выше: Как включить имя типа в сериализацию?

Используя подход to_json или as_json, просто включите в свою модель следующий фрагмент кода, чтобы переопределить поведение по умолчанию:

def as_json
  super.as_json {methods: [:type]}
end

def type
  self.model_name.name
end

Ответ 4

Для текущего 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:: Result.