2011-11-11 11 views
28

配列であるクラスの属性を作成することはできますか?私はthisを読んでみましたが、それほど多くは得られませんでした。Rubyモデルの配列属性

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

は、アレイ

class Arches < ActiveRecord::Base 
    serialize :thearray,Array 
end 
にフィールドがシリアル化させるために、テキストフィールド

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

編集モデルでモデルを作成します。

テストアウト

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

移行:モデルの使用serialize

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

class MyModel 
    serialize :thearray, Array 
    ... 
end 

Marnenが彼の答えで言うように、あなたが保存したい情報の種類を知ることが良いでしょうその配列では、直列化された属性が最適なオプションではない可能性があります。

[Marten Veldthuisの警告]シリアル化された配列の変更には注意してください。あなたはこのように直接それを変更した場合:正常に動作しますが、

my_model.thearray = [1,2,3] 

を、あなたはこれを行う場合:

my_model.thearray << 4 

その後のActiveRecordはthearrayの値が変更されたことを検出しません。その変更についてのARを言うと、あなたはこれを実行する必要があります。

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

これは文字列の配列になります。行く道を直列化していますか? – tquarton

+0

@tquartonほとんど確かではありません。私の答えを見てください。 –

9

Whあなたがtoklandとしてシリアライズされた配列を使うことができれば、これはリレーショナルデータベースではめったに良いことではありません。配列は、エンティティオブジェクトを保持している場合、それはおそらくhas_many関係など、より良いモデル化されたのです、

  • :次の3つの優れた選択肢を持っています。
  • 配列が実際に数値などの値の配列である場合は、各値を別のフィールドに入れてcomposed_ofを使用すると便利です。
  • has_manyではない多くの配列値を使用する場合は、実際に配列フィールドをサポートするDBを調べることをお勧めします。 PostgreSQLはこれを行います(そして配列フィールドはRails 4の移行でサポートされています)が、MongoDBのような非SQLデータベースか、MagLevのようなオブジェクト永続性のいずれかを使用したい場合があります。

あなたのユースケース、つまり配列にどのようなデータが含まれているかを説明できる場合は、何が最善の動作であるかを理解するのを助けることができます。

+0

ああ、私の配列は文字列でしかありません。どう思いますか? – tquarton

+0

配列は何を表していますか?なぜあなたはそれを最初に持っていますか? –

+3

私はもともと、配列やハッシュがネイティブに格納されているSQLデータベースは知らなかったと書いていました。 Postgresはこれらのタイプの両方をネイティブで扱いますが、Rails 4はそれらをマイグレーションとActiveRecordでサポートしています。 Postgresを使うもう一つの理由。 :) –

関連する問題