このようなデータを保存したい:
User.create(name:"Guy", properties:{url:["url1","url2","url3"], street_address:"asdf"})
Rails 4?これまでのところ、移行を試みました:add_column :users, :properties, :hstore, array: true
しかし、配列をhstoreに保存すると、エラーが返されます。
PG::InvalidTextRepresentation: ERROR: array value must start with "{" or dimension information
hstore
は、キーと値の両方が単純な非構造化文字列である単純なキー/値ストレージを対象としています。 細かいマニュアル から:
F.16。 hstore
このモジュールは、単一のPostgreSQL値内にキーと値のペアのセットを格納するための
store
データ型を実装します。 [...]キーと値は単なるテキスト文字列です。
最後の文に注意してください。hstore
のキーと値は文字列です。つまり、配列を文字列との間で変換するための手持ちがなければ、配列をhstore
値に入れることはできず、そのようなことをいじりたくないということです。
ただし、使用可能な JSONデータ型 があります。
8.14。 JSONタイプ
RFC 4627で指定されているように、
json
データ型を使用してJSON(JavaScript Object Notation)データを格納できます。
jSONは、埋め込まれた配列とオブジェクトを簡単に処理できます。代わりにJSONを使用してみてください。
add_column :users, :properties, :json
ただし、最初に古いhstore
列を削除する必要があります。
また、hstore
sの配列を格納していなかったため、hstore
列にarray: true
が必要ではなく、そのうちの1つが必要でした。
ムーの答えを追加します。 Hstoreも数か月以内に非常に有望なアップデートを提供しています(Postgresql 9.4は2014年の第3四半期にリリースされます)。
これらの制限に対処する必要がある今後の変更のいくつか ハイライト :
現在、hstoreとjsonのどちらかを選択するのは非常に困難です。あまりにも似ていて、更新が速すぎるからです。
Muの答えに対する私の2セント。コメントを追加するのに十分な評判がないため、これを回答として投稿しています。
JSONは、「複雑な」データを格納するための頼りになるソリューションになりつつあります。
Hstoreの作者の1人であるOlegBartunov自身は、JSONよりもhstoreを使用する利点はないと述べ、彼は 人々がjsonbを使用することを奨励しています 。
2014年3月23日 jsonb、jsonを格納するための構造化フォーマット が、pgsql開発メーリングリストに正式に導入されました。
2014年5月15日、JSONBは PostgreSQL 9.4 Beta 1 リリースの発表にリストされました。
JSONB:9.4には、新しいJSONB「バイナリJSON」タイプが含まれています。ドキュメントデータ用のこの新しいストレージ形式は、より高性能であり、JSONデータを操作するためのインデックス作成、関数、および演算子が付属しています。