วิธีการแปลงผลลัพธ์ 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 ของฉันในภายหลัง ฉันจะทำเช่นนี้ได้อย่างไร?


คำตอบ:


211

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

4
+1 สำหรับการแนะนำ serializable_hash - นี่เป็นครั้งแรกที่ฉันเจอคำตอบที่กล่าวถึงเรื่องนี้ น่าเศร้าที่ฉันกำลังใช้โซลูชัน JSON ล่าสุด แต่ตอนนี้จะดูที่การใช้ serializable_hash ฉันต้องการทราบวิธีรวมชื่อคลาสกับแต่ละระเบียนเช่นเดียวกับที่คุณอาจได้รับหากคุณรวมรูทใน JSON
Dom

@Dom 웃ถ้าฉันเข้าใจถูกต้องให้ดูสิ่งนี้: stackoverflow.com/questions/17090891/…
hdorio

@Dom ดูคำตอบของฉันด้านล่าง
Fredrik E

tasks_records = TaskStoreStatus.all.map(&:attributes)อีกวิธีหนึ่งที่เป็นไปได้คือ
Rigo

การแก้ปัญหาที่ดีจริงๆมากกว่าที่นี่ แต่คำถามของฉันอาจจะอะไรคือประโยชน์ของการใช้อย่างใดอย่างหนึ่ง.as_json, &:serializable_hashและ&:attributes? มันเกี่ยวข้องกับตัวช่วย ActiveRecord หรือโดยตรงกับประสิทธิภาพหรือไม่? ขอบคุณล่วงหน้าครับ! @Dom @Rigo @Fredrik E
alexventuraio


10

สำหรับ 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ใช้แทน สิ่งนี้แปลกสำหรับฉัน
ฟิล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.