4

Rails の .to_json() メソッドを使用してハッシュを JSON に変換します。

ハッシュ:

{ "Größe" => "XL" }

JSON:

"{\"Gr\\u00f6\\u00dfe\":\"XL\"}"

その後、JSON 文字列は、この Rails (3.2.6) SQL コマンドによってstaticと呼ばれる hstore (Postgres) 列に格納されます。

UPDATE ... "static" = 'options=>"{\"Gr\u00f6\u00dfe\":\"XL\"}"' WHERE ...

すでに 1 つのエスケープ バックスラッシュがありません。

データベース自体では、静的列は次のようになります。

"options"=>"{\"Gru00f6u00dfe\":\"XL\"}"

u00f6u00dfeのバックスラッシュはすべてなくなりました。

JSON.parse() はマルチバイト文字を識別できなくなったため、次のハッシュを返します。

{ "Gru00f6u00dfe" => "XL" }

これを防ぐ方法を知っている人はいますか?助けてくれてありがとう!

4

1 に答える 1

0

デフォルトでは、Rails は PostgreSQL の hstore をサポートしていません。しかし、修正は簡単です。gem を使用するだけactiverecord-postgres-hstoreです。を使用activerecord-postgres-hstoreすると、シリアライゼーションやエンコーディングの問題から解放されます。ここに方法があります

1)gemをインストールしてから、静的列のタイプをhstoreに変更します

class ChangeHStoreDateTypeInMyTable < ActiveRecord::Migration
  def change
   change_column :my_table, :static, :hstore
  end

2) インデックスを追加

CREATE INDEX my_table_gin_static ON my_table USING GIN(static);

3) これで、シリアライゼーションやエンコーディングを気にせずに、通常どおりにモデル エンティティをインスタンス化して値を更新できます。

@model.static["Größe"] = "XL"

詳細: https://github.com/softa/activerecord-postgres-hstore

于 2012-09-20T04:13:50.707 に答える