2012-01-25 2 views
5

私はRailsのSQLiteデータベースに配列の配列を保持しようとしています。Ruby on Railsでデータベースに配列を保持する方法はありますか?

今、私はそのような配列を保持できるオブジェクトを持っており、インスタンスは問題なく保存されているようです。しかし、データベースに永続化されていないことは明らかです。配列が作成されたビューとは異なるビューでMy_Object.arrayの関数を呼び出すと、nilとなり、機能しません。例えば

class My_Object < ActiveRecord::Base 
    attr_accessor :array 
end 

私はMy_Object.new(:array => [ [1, 2, 3], [4, 5, 6] ])を呼び出すと、すべてが正常に動作しているように見えますが、私はどこか他の:arrayプロパティにアクセスすることはできません、それだけではnilが判明。

アイデア?

答えて

12

最初にテーブルにarrayという名前のテキスト列を作成します。そして、serializeを使用します。

自動的にYAMLを使用して、配列をシリアライズし、自動的にデータベースからそれを引き戻すときにそれを解凍します
class My_Object < ActiveRecord::Base 
    serialize :array 
end 

しかし、あなたのデザインを再考する必要があります。データベース内のシリアライズされたデータでは何も行うことはできません。特にクエリで使用することはできません。 YAMLは、データベースに入って戻って来る単なる不透明なブロブに過ぎず、データベースは他のことをすることができません。データベースがarrayの内部を見る必要がないことが確かな場合は、serializeを使用してください。そうしないと、配列データを格納するために余分なテーブルを設定する必要があります。

+0

実際のアプリケーションはほぼ完全にこの配列を使用しています...私は最初の配列を保持する 'Game'オブジェクトを使用して、レールアプリケーションに人生のゲームを実装しようとしています - この配列は基本的にすべてこれはアプリケーション全体で使用されます。新しいポイントを得るためにアルゴリズム全体を実行することがポイントです。これは 'serialize'を使っても可能ですか?私はプログラム全体をリワークすべきですか? –

+1

@Benjamin: 'serialize'はそのようなもののためにうまくいくはずです。 –

+3

ちょっとしたこと:配列を強制する場合は 'serialize:array、Array'を使うことができます。 – Swanand

関連する問題