Jak przekonwertować wyniki ActiveRecord na tablicę skrótów

112

Mam wynik ActiveRecord operacji wyszukiwania:

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

Teraz chcę przekonwertować te wyniki na tablicę skrótów, takich jak ta:

[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" }

dzięki czemu będę mógł iterować po tablicy i dodawać więcej elementów do skrótów, a później przekonwertować wynik na JSONmoją odpowiedź API. W jaki sposób mogę to zrobić?

Avinash Mb
źródło

Odpowiedzi:

210

as_json

Powinieneś użyć as_jsonmetody, która konwertuje obiekty ActiveRecord na Ruby Hashes pomimo swojej nazwy

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

Możesz również przekonwertować dowolne obiekty ActiveRecord na Hash za pomocą serializable_hashi możesz przekonwertować dowolne wyniki ActiveRecord na tablicę za pomocą to_a, więc na przykład:

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

A jeśli chcesz mieć brzydkie rozwiązanie dla Railsów przed wersją 2.3

JSON.parse(tasks_records.to_json) # please don't do it
hdorio
źródło
4
+1 za sugestię serializable_hash - to pierwszy raz, kiedy natknąłem się na odpowiedź, która o tym wspomina. Niestety, obecnie używam ostatniego rozwiązania JSON, ale teraz przyjrzę się użyciu serializable_hash. Muszę tylko dowiedzieć się, jak dołączyć nazwę klasy do każdego rekordu, tak samo, jak można by uzyskać, jeśli włączysz root w JSON.
Dom
@Dom 웃 Jeśli dobrze rozumiem, zobacz: stackoverflow.com/questions/17090891/ ...
hdorio
@Dom zobacz moją odpowiedź poniżej.
Fredrik E
Innym możliwym sposobem jest tasks_records = TaskStoreStatus.all.map(&:attributes).
Rigo
Naprawdę świetne rozwiązania tutaj, ale moje pytanie może być Jakie są korzyści z używania albo .as_json, &:serializable_hashi &:attributes? Czy ma to związek z pomocnikami ActiveRecord, czy bezpośrednio z wydajnością? z góry dzięki chłopaki! @Dom @Rigo @Fredrik E
alexventuraio
35

Może?

result.map(&:attributes)

Jeśli potrzebujesz klawiszy symboli:

result.map { |r| r.attributes.symbolize_keys }
Elena Unanyan
źródło
9

Dla aktualnego ActiveRecord (4.2.4+) istnieje metoda to_hashna Resultobiekcie, która zwraca tablicę skrótów. Następnie możesz zmapować go i przekonwertować na symboliczne skróty:

# 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"},
      ...
     ]

Więcej informacji można znaleźć w dokumentacji ActiveRecord :: Result .

sventechie
źródło
Nie może być prostsze i jaśniejsze niż to. Dziękuję Ci bardzo.
WM
1
Uwaga, jeśli twoja wersja ActiveRecord nie rozpoznaje to_hashmetody: spróbuj to_aryzamiast tego. O dziwo, to zadziałało dla mnie.
Phil,