0

ネストされたXMLでバルクオブジェクトを受け取り、各ノードに特定のフィールドを保存する必要があるRailsWebフックサービスコンシューマーを作成しています。XMLデータがHooksControllerの作成アクションにヒットすると、XMLは自動的に次のようなハッシュに変換されます。

Parameters: {"Events"=>{"RecordSet"=>{"Record"=>[{"SENDER_LAST_NAME"=>"Smith",
"SENDER_MIDDLE_NAME"=>"S.", "EVENT_ID"=>"3904", "SENDER_FIRST_NAME"=>"John", 
"EVENT_TYPE"=>"Contact", "SENDER_MSISDN"=>"0723xxxxxx", "EVENT_DATE"=>"2011-05-31"},
{"SENDER_LAST_NAME"=>"Simiyu", "SENDER_MIDDLE_NAME"=>"N.", 
"EVENT_ID"=>"2447", "SENDER_FIRST_NAME"=>"Steve", "EVENT_TYPE"=>"Tag", 
"SENDER_MSISDN"=>"0720xxxxxxx", "EVENT_DATE"=>"2011-05-31"}]}, "xmlns"=>""}}

ハッシュ内のイベントに対応するExternalEventsモデルにはハッシュ内のすべてのフィールドがないため、各オブジェクトのすべてのフィールドを保存したくありません。また、保存する前に、フィールドSENDER_MSISDNを登録ユーザーのMSISDNと照合します。通常、私はNokogiriを使用してXMLを解析し、その後ループでModelオブジェクトを作成しますが、railsが自動的にハッシュに変換するため、これを行うことはできません。入ってくるXMLの構造を変更する方法がありません。これをうまく処理する方法の手がかりを探してみました。

私はこれで髪をはぎ取る寸前です。

4

2 に答える 2

0
external_event = ExternalEvents.new(params[:Events][:RecordSet][:Record])

これにより、フィールド名が一致すると仮定して、レコードハッシュのキーと値のペアに一致する属性を持つ新しいインスタンスが作成されます。

SENDER_MSISDNでモデル検証を使用し、external_events.SENDER_MSISDN列に外部キー制約を設定します。

于 2011-06-02T16:13:57.220 に答える
0

これを行うには、手動コードを作成する必要があります。次のようなものはどうですか?

params["Events"]["RecordSet"]["Record"].each do |h|
  ExternalEvent.create(h.merge({ :MSISDN => h["SENDER_MSISDN"] }))
end

特定のフィールドを削除する必要がある場合は、のdelete_ifメソッドを使用できますHash。例えば:

h.merge(..).delete_if {|key, value| [ "DONT_WANT", "THIS"].include?(key) }
于 2011-06-02T16:19:15.147 に答える