ruby-on-rails-3
  • json
  • utf-8
  • multibyte
  • hstore
  • 2012-09-10 16 views 4 likes 
    4

    我使用Rails的.to_json()方法將我的哈希轉換爲JSON。保存到數據庫時JSON中的多字節字符丟失

    哈希:

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

    JSON:

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

    之後JSON字符串被存儲在hstore(Postgres的)柱稱爲由該導軌靜態(3.2.6)SQL命令:

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

    已經有一個逃避反斜槓丟失。

    在數據庫本身靜態列如下:

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

    u00f6u00dfe所有反斜線都沒有了。

    JSON.parse()來沒有任何標識的多字節字符多,所以它返回以下散列:

    { "Gru00f6u00dfe" => "XL" } 
    

    有沒有人一個想法如何避免這種情況?謝謝你的幫助!

    回答

    0

    開箱即用,rails不支持PostgreSQL的hstore。但修復很簡單,只需使用activerecord-postgres-hstore寶石。使用activerecord-postgres-hstore將使您免於序列化或編碼問題。這裏是如何

    1)安裝寶石&然後更改靜態列類型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

    +0

    感謝您的努力,但這個問題似乎由JSON編碼造成的。由於它是一個多維數組,我想使用JSON進行序列化。 由於Postgres 9.2在前幾天推出,我將嘗試直接使用新的JSON數據類型來解決它。 – Railsana

    相關問題