2010-06-23 17 views
23

का उपयोग कर डेटाबेस में सरणी संग्रहीत करना मैं रेल पर हूं 2.3.8 & मैं डीएस एडाप्टर के रूप में mysql का उपयोग कर रहा हूं। मैं अपने डेटाबेस में सरणी स्टोर करना चाहता हूं। खोज के बाद मैं इस बहुत उपयोगी article के साथ आ सकता था।ActiveRecord

अब मुझे इनपुट & इनपुट सर्वर कंसोल के लिए जीयूआई का उपयोग करने की आवश्यकता नहीं है। तो कहें कि मेरे पास nums नामक टेक्स्ट फ़ील्ड है जो तर्कसंगत रूप से int सरणी होना चाहिए। संख्याओं का प्रारूप क्या होना चाहिए ताकि & उस स्ट्रिंग से सरणी को संग्रहीत करना आसान हो जाए?

+0

रेल 4 में, आप अब 'array' प्रकार है, जो यह PostgreSQL पर एक सरणी, वरना सब कुछ पर एक स्ट्रिंग के रूप के रूप में संग्रहीत करता है का उपयोग कर सकते हैं। – Zaz

उत्तर

35

यदि आप serialize का उपयोग करते हैं तो आपको चिंता करने की ज़रूरत नहीं है कि टेक्स्ट फ़ील्ड में डेटा कैसे संग्रहीत किया जाता है, हालांकि यह वास्तव में वाईएएमएल है।

serializethe Rails/ActiveRecord API में प्रलेखित है

प्रदर्शन के लिए, आप एक प्रारूप है कि उपयोगकर्ताओं को और करने के लिए समझा जा सकता है की जरूरत है (अनुभाग अध्यक्षता में "सहेजा जा रहा सरणियों, हैश, और अन्य गैर mappable पाठ स्तंभ में वस्तुओं" के लिए नीचे स्क्रॉल) जिसे आसानी से आपके कोड में एक सरणी में परिवर्तित किया जा सकता है। अल्पविराम- या अंतरिक्ष-सीमित?

उत्पादन के लिए प्रारूपण:

num_array = nums.split(delim).map(&:to_i) # or to_f if not integers 

या शायद स्ट्रिंग # स्कैन का उपयोग कर:

delim = ',' # or ' ' for spaces, or whatever you choose 
array.join(delim) 

एक सरणी में वापस परिवर्तित इस प्रकार काम कर सकते हैं?

num_array = nums.scan(/\d+/).map(&:to_i) # for positive integers 
+0

धन्यवाद माइक। :) मैंने इसे पहले से ही समझ लिया था। एक अभी भी आसान (हालांकि त्रुटि प्रवण) तरीका सीधे eval फ़ंक्शन का उपयोग करने के लिए है। तो: num_array = eval (nums) भी मीठा काम करते हैं! –

+3

यह आसान है, लेकिन यदि आप eval का उपयोग करने जा रहे हैं, तो आपको अमान्य इनपुट के लिए डेटा को बहुत अच्छी तरह से साफ़ करने की आवश्यकता है। अगर आप सावधान नहीं हैं तो eval() सुरक्षा छेद का एक टन खुलता है। – MunkiPhD

13

यदि आप पोस्टग्रेज़ और रेल 4 का उपयोग कर रहे हैं, तो अब आपके पास बेहतर देशी विकल्प है।

# db/migrate/20140207133952_create_books.rb 
create_table :books do |t| 
    t.string 'title' 
    t.string 'tags', array: true 
    t.integer 'ratings', array: true 
end 
add_index :books, :tags, using: 'gin' 
add_index :books, :ratings, using: 'gin' 

# app/models/book.rb 
class Book < ActiveRecord::Base 
end 

# Usage 
Book.create title: "Brave New World", 
      tags: ["fantasy", "fiction"], 
      ratings: [4, 5] 

## Books for a single tag 
Book.where("'fantasy' = ANY (tags)") 

## Books for multiple tags 
Book.where("tags @> ARRAY[?]::varchar[]", ["fantasy", "fiction"]) 

## Books with 3 or more ratings 
Book.where("array_length(ratings, 1) >= 3") 

http://edgeguides.rubyonrails.org/active_record_postgresql.html