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अपनी एपीआई प्रतिक्रिया के लिए परिवर्तित करने में सक्षम हो जाऊंगा । मैं यह कैसे कर सकता हूँ?


यह भी देखें stackoverflow.com/q/20794398/165673
यारिन

जवाबों:


210

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 ऑब्जेक्ट को हैश के साथ serializable_hashपरिवर्तित कर सकते हैं और आप किसी भी ActiveRecord परिणाम को किसी सरणी में परिवर्तित कर सकते हैं to_a, इसलिए अपने उदाहरण के लिए:

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

और अगर आप v2.3 से पहले रेल के लिए एक बदसूरत समाधान चाहते हैं

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

4
+1 serializable_hash सुझाव देने के लिए - यह पहली बार है जब मैंने कभी ऐसा उत्तर दिया है जिसका उल्लेख है। दुख की बात है कि मैं वर्तमान में अंतिम JSON समाधान का उपयोग कर रहा हूं, लेकिन अब serializable_hash का उपयोग करके देखूंगा। मुझे केवल यह पता लगाने की आवश्यकता है कि प्रत्येक रिकॉर्ड के साथ वर्ग का नाम कैसे शामिल किया जाए, यदि आप JSON में रूट शामिल करते हैं, तो आप इसे प्राप्त कर सकते हैं।
डोम

@ डॉम D अगर मुझे सही से समझ में आया तो यह देखें: stackoverflow.com/questions/17090891/…
hdorio

@ नीचे मेरा जवाब देखें
फ्रेड्रिक ई

दूसरा संभावित तरीका है tasks_records = TaskStoreStatus.all.map(&:attributes)
रिगो

यहाँ पर वास्तव में महान समाधान, लेकिन मेरा सवाल यह हो सकता है कि या तो उपयोग करने के क्या लाभ हैं .as_json, &:serializable_hashऔर &:attributes? क्या इसे ActiveRecord सहायकों के साथ या सीधे प्रदर्शन के साथ करना है? अग्रिम लोगों में धन्यवाद! @Dom @Rigo @Fredrik E
एलेक्सवेंटुरायो


9

वर्तमान 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इसके बजाय प्रयास करें । अजीब तरह से यह मेरे लिए काम किया।
फिल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.