2011-11-11 29 views
28

Bir dizi olan bir sınıf için bir özellik oluşturmak mümkün mü? this'u okumayı denedim ama çok fazla anlamadım. Böyle bir şey yapmak istiyorum: Ben Arch örneğinde .thearray çağırdığınızda ben yeni unsurlar ekleyebilir dizisini almakRuby Model için Dizi Özniteliği

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

öyle ki.

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

cevap

47

bir metin alanına

> 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) ========================================== 

düzenlemek bir dizi

class Arches < ActiveRecord::Base 
    serialize :thearray,Array 
end 
için saha tefrika yapmak için modeli sahip bir model oluşturma

testi dışarı

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

Göç: Marnen onun cevabını söylediği gibi

class MyModel 
    serialize :thearray, Array 
    ... 
end 

, depolamak istediğiniz bilgi ne tür bilmek iyi olurdu: Model kullanımı serialize yılında

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

Bu dizide, serileştirilmiş bir özellik en iyi seçenek olmayabilir.

[Marten Veldthuis 'uyarısı] Serileştirilmiş diziyi değiştirmeye dikkat edin. Böyle doğrudan değiştirirseniz: çalışıyor, ancak

my_model.thearray = [1,2,3] 

bunu yaparsanız:

my_model.thearray << 4 

Sonra ActiveRecord thearray değeri değiştiğini algılamaz. söz konusu değişiklikle ilgili AR söylemek gerekirse, bunu yapmak gerekir:

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

Dizeleri bir dizi olacaktır. Gidilecek yolu serileştiriyor mu? – tquarton

+0

@tquarton Neredeyse kesinlikle değil. Cevabımı gör. –

9

Wh tokland'ın önerdiği gibi serileştirilmiş bir dizi kullanabilirsiniz, bu ilişkisel bir veritabanında nadiren iyi bir fikirdir. Dizi varlık nesneleri tutan

  • , büyük olasılıkla daha iyi modellenmiş bir has_many ilişki olarak açıklanmıştır: Üç üstün alternatifleri vardır.
  • Dizi gerçekten sayılar gibi bir değer dizisi ise, her değeri ayrı bir alana koymak ve composed_of'u kullanmak isteyebilirsiniz.
  • has_many s olmayan çok fazla dizi değeri kullanacaksanız, aslında dizi alanlarını destekleyen bir DB araştırmak isteyebilirsiniz. PostgreSQL bunu yapar (ve dizi alanları Rails 4 geçişlerinde desteklenir), ancak MongoDB gibi bir SQL olmayan veritabanını veya MagLev gibi nesnenin kalıcı olmasını sağlamak isteyebilirsiniz.

Kullanım durumunuzu - yani dizide sahip olduğunuz verileri - tanımlayabilirseniz, en iyi eylem yolunun ne olduğunu anlamaya yardımcı olabiliriz.

+0

Ah tamam, dizim sadece dizgilerden oluşuyor. Ne düşünüyorsun? – tquarton

+0

Dizi neyi temsil ediyor? Neden ilk etapta var? –

+3

Orijinal olarak dizileri veya karmaları doğal olarak depolayan herhangi bir SQL veritabanını bilmediğimi yazdım. Postgres anlaşmalarını her iki türle de doğal olarak kapatır ve Rails 4 bunları geçişlerde ve ActiveRecord'ta destekler. Postgres'i kullanmak için bir sebep daha. :) –