ActiveRecord sonuçlarını bir karma dizisine dönüştürme


112

Bulma işleminin ActiveRecord sonucuna sahibim:

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

Şimdi bu sonuçları şunun gibi bir hash dizisine dönüştürmek istiyorum:

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

Böylece dizi boyunca yineleme yapabileceğim ve karmalara daha fazla öğe ekleyebileceğim ve daha sonra sonucu JSONAPI yanıtıma dönüştürebileceğim . Bunu nasıl yapabilirim?


Yanıtlar:


211

as_json

as_jsonActiveRecord nesnelerini ismine rağmen Ruby Hashes'a dönüştüren yöntemi kullanmalısınız.

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

Ayrıca herhangi bir ActiveRecord nesnesini bir Hash ile serializable_hashdönüştürebilir ve herhangi bir ActiveRecord sonucunu bir Dizi'ye dönüştürebilirsiniz to_a, yani örneğiniz için:

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

Ve v2.3'ten önceki Rails için çirkin bir çözüm istiyorsanız

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

4
+1 serializable_hash önermek için - ilk kez bundan bahseden bir cevapla karşılaşıyorum. Maalesef şu anda son JSON çözümünü kullanıyorum, ancak şimdi serializable_hash kullanmaya bakacağım. JSON'a root eklerseniz elde edebileceğiniz gibi, her kayda sınıf adını nasıl dahil edeceğimi bulmam gerekiyor.
Dom

@Dom 웃 Doğru anladıysam şunu görün: stackoverflow.com/questions/17090891/…
hdorio

@Dom aşağıdaki cevabıma bakın.
Fredrik E

Bir başka olası yol da tasks_records = TaskStoreStatus.all.map(&:attributes).
Rigo

Burada gerçekten harika çözümler var, ama sorum şu olabilir , ve kullanmanın faydaları nelerdir ? ActiveRecord yardımcıları ile mi yoksa doğrudan performansla mı ilgisi var? .as_json&:serializable_hash&:attributesşimdiden teşekkürler beyler! @Dom @Rigo @Fredrik E
alexventuraio

36

Olabilir?

result.map(&:attributes)

Simge tuşlarına ihtiyacınız varsa:

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

10

Mevcut ActiveRecord (4.2.4+) to_hashiçin, Resultnesne üzerinde bir karma dizisi döndüren bir yöntem vardır . Daha sonra bunun üzerine eşleyebilir ve sembolize edilmiş hashlere dönüştürebilirsiniz:

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

Daha fazla bilgi için ActiveRecord :: Result belgelerine bakın .


Bundan daha basit ve net olamaz. Çok teşekkür ederim.
WM

1
ActiveRecord sürümünüz to_hashyöntemi tanımıyorsa bir not : to_arybunun yerine deneyin . Garip bir şekilde bu benim için çalıştı.
Phil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.