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