0

我正在编写一个 rails web-hooks 服务使用者,它接收嵌套 XML 中的批量对象,并且需要在每个节点中保存某些字段。当 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,然后在循环中创建模型对象,但我不能这样做,因为 rails 会自动将其转换为哈希。我无法更改传入的 XML 的结构。我尝试寻找有关如何解决此问题的线索,但未成功。

我差点在这个上扯掉我的头发。

4

2 回答 2

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 回答
0
external_event = ExternalEvents.new(params[:Events][:RecordSet][:Record])

这应该创建一个新实例,其属性与 Record 哈希中的键值对匹配,假设您的字段名称匹配。

在 SENDER_MSISDN 上使用模型验证并在 external_events.SENDER_MSISDN 列上放置外键约束。

于 2011-06-02T16:13:57.220 回答