2017-11-19 13 views
0

データベース内のハッシュに列の値を更新しようとしています。データベースの列はテキストです。私が持っているモデルでは値は、シリアル化後にActiveSupport :: HashWithIndifferentAccessでDB内で更新されます

、コントローラで

serialize :order_info 

私は更新アクション

def update 
    Order.update_order_details(update_params, params[:order_info]) 
    head :no_content 
    end 

を持っorder_infoは任意のハッシュであると研究を行った後、ので、私は、強いのparamsをorder_infoための強力なパラメータは致しておりません任意のハッシュをサポートしていません

私が渡そうとしている値は以下の通りです

"order_info": { 
    "orders": [ 
     { 
      "test": "AAAA" 
     } 
    ], 
"detail": "BBBB", 
"type": "CCCC" 
} 

しかし、私はそれが

--- !ruby/object:ActionController::Parameters parameters: !ruby/hash:ActiveSupport::HashWithIndifferentAccess comments: - !ruby/hash:ActiveSupport::HashWithIndifferentAccess  test: AAAA detail: BBBB type: CCCC permitted: false 

シリアル化がactivesupportののインスタンスである:: HashWithIndifferentAccessので、私は、なぜその値にthatsの推測していますように、データベースに更新されます値を更新してみてください。余分なものを取り除き、ハッシュを更新するにはどうすればいいですか?

答えて

1

あなたが任意のフィルタリングなしparams[:order_info]からすべてActionController::Parametersのものをアンラップしたい場合は、一番簡単な方法は、コールto_unsafe_h(またはそのエイリアスto_unsafe_hash)です:

hash = params[:order_info].to_unsafe_h 

Rails4であなたの昔ながらを与える必要がありますhashHashが、私の知る限りRails5はそうあなたがto_h呼び出しを追加したい場合がありますあなたにActiveSupport::HashWithIndifferentAccessを与える:

hash = params[:order_info].to_unsafe_h.to_h 

to_h呼び出しはRails4では何も行いませんが、Rails5にアップグレードする際に心配することはありません。

その後、あなたの更新コール:

"---\n:order_info:\n :orders:\n - :test: AAAA\n :detail: BBBB\n :type: CCCC\n" 

あなたもdeep_stringify_keys呼び出しでスローする場合があります:

Order.update_order_details(
    update_params, 
    params[:order_info].to_unsafe_h.to_h # <-------- Extra DWIM method calls added 
) 

は、あなたが探しているデータベースであなたにYAMLを与える必要があります

params[:order_info].to_unsafe_h.to_h.deep_stringify_keys 

YAMLizied Hashで必要なキーの種類によって異なります。

+0

ありがとうございました。私も.to_unsafe_h.deep_symbolize_keysを試しましたが、あなたの答えははるかに優れています。あなたは明日私の日を救った:) – mike

関連する問題