2011-11-11 10 views
28

के लिए ऐरे विशेषता क्या एक सरणी के लिए एक विशेषता बनाना संभव है? मैंने this पढ़ने की कोशिश की लेकिन मुझे इससे बहुत कुछ नहीं मिला। मैं इस तरह कुछ करना चाहता हूँ:रूबी मॉडल

class CreateArches < ActiveRecord::Migration 
    def change 
    create_table :arches do |t| 
     t.string :name 
     t.array :thearray 
     t.timestamps 
    end 
    end 
end 

ऐसी है कि जब मैं आर्क का एक उदाहरण पर .thearray फोन मैं एक सरणी है कि मैं करने के लिए नए तत्व जोड़ सकते हैं मिलता है।

ruby-1.9.2-p290 :006 > arc = Arch.new 
ruby-1.9.2-p290 :007 > arc.thearray 
=> [] 

उत्तर

47

एक पाठ क्षेत्र

> rails g model Arches thearray:text 
    invoke active_record 
    create db/migrate/20111111174052_create_arches.rb 
    create app/models/arches.rb 
    invoke test_unit 
    create  test/unit/arches_test.rb 
    create  test/fixtures/arches.yml 
> rake db:migrate 
== CreateArches: migrating =================================================== 
-- create_table(:arches) 
    -> 0.0012s 
== CreateArches: migrated (0.0013s) ========================================== 

संपादित क्षेत्र एक सरणी

class Arches < ActiveRecord::Base 
    serialize :thearray,Array 
end 
को धारावाहिक बनाने के लिए अपने मॉडल के साथ एक मॉडल बनाएं

यह परीक्षण बाहर

ruby-1.8.7-p299 :001 > a = Arches.new 
=> #<Arches id: nil, thearray: [], created_at: nil, updated_at: nil> 
ruby-1.8.7-p299 :002 > a.thearray 
=> [] 
ruby-1.8.7-p299 :003 > a.thearray << "test" 
=> ["test"] 
6

प्रवासन:

t.text :thearray, :default => [].to_yaml 

मॉडल उपयोग serialize में:

class MyModel 
    serialize :thearray, Array 
    ... 
end 

Marnen उसके जवाब में कहते हैं, यह अच्छा है पता करने के जानकारी आप किस तरह का स्टोर करना चाहते हो सकता है उस सरणी में, एक धारावाहिक विशेषता सबसे अच्छा विकल्प नहीं हो सकता है।

[मार्टन वेल्डथ्यूस की चेतावनी] धारावाहिक सरणी को बदलने के बारे में सावधान रहें। आप इस तरह से इसे सीधे परिवर्तित करते हैं:

my_model.thearray = [1,2,3] 

कि ठीक काम करता है, लेकिन आप यह करते हैं, तो:

my_model.thearray << 4 

तो ActiveRecord का पता नहीं लगा होगा कि thearray का मूल्य बदल गया है। कि परिवर्तन के बारे में एआर कहता हूं, यदि आप ऐसा करने की जरूरत है:

my_model.thearray_will_change! 
my_model.thearray << 4 
+0

यह तारों की एक सरणी होगी। जाने का रास्ता serialize है? – tquarton

+0

@tquarton लगभग निश्चित रूप से नहीं। मेरा जवाब देखें –

9

Wh ile आप सुझाए गए टोकनलैंड के रूप में एक धारावाहिक सरणी का उपयोग कर सकते हैं, यह एक संबंधपरक डेटाबेस में शायद ही कभी एक अच्छा विचार है। आपके पास तीन बेहतर विकल्प हैं:

  • यदि सरणी इकाई वस्तुओं को रखती है, तो शायद यह has_many संबंध के रूप में बेहतर ढंग से मॉडलिंग किया गया है।
  • यदि सरणी वास्तव में संख्याओं जैसे मानों की एक सरणी है, तो हो सकता है कि आप प्रत्येक मान को एक अलग फ़ील्ड में रखना चाहें और composed_of का उपयोग करें।
  • यदि आप बहुत सारे सरणी मानों का उपयोग करने जा रहे हैं जो has_many एस नहीं हैं, तो आप वास्तव में एक डीबी की जांच करना चाहेंगे जो वास्तव में सरणी फ़ील्ड का समर्थन करता है। PostgreSQL यह करता है (और सरणी फ़ील्ड रेल 4 माइग्रेशन में समर्थित हैं), लेकिन हो सकता है कि आप या तो गैर-SQL डेटाबेस जैसे मोंगोडीबी या ऑब्जेक्ट दृढ़ता का उपयोग करना चाहें जैसे कि MagLev प्रदान करना है।

यदि आप अपने उपयोग के मामले का वर्णन कर सकते हैं - यानी, आपको सरणी में कौन सा डेटा मिला है - हम यह जानने में मदद कर सकते हैं कि कार्रवाई का सर्वोत्तम तरीका क्या है।

+0

आह ठीक है, मेरी सरणी केवल तारों का होगा। तुम क्या सोचते हो? – tquarton

+0

सरणी का प्रतिनिधित्व क्या करता है? आपके पास पहली जगह क्यों है? –

+3

मैंने मूल रूप से लिखा था कि मुझे किसी भी SQL डेटाबेस के बारे में पता नहीं था जो सरणी या हैश को मूल रूप से संग्रहीत करता है। इन दोनों प्रकारों के साथ पोस्टग्रेस सौदों को मूल रूप से बदल देता है, और रेल 4 उन्हें माइग्रेशन और ActiveRecord में समर्थन देता है। Postgres का उपयोग करने के लिए बस एक और कारण है। :) –

संबंधित मुद्दे