Rails создает массовые объекты через веб-сервис - PullRequest
0 голосов
/ 02 июня 2011

Я пишу потребителю службы rails web-hooks, который получает объемные объекты во вложенном XML и должен сохранять определенные поля в каждом узле. Когда данные XML попадают в мое действие create в моем 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. Я попытался найти ключ к решению этой проблемы безуспешно.

Я на грани срывания волос на этом.

Ответы [ 2 ]

0 голосов
/ 02 июня 2011

Для этого вам нужно написать некоторый ручной код.Как насчет чего-то вроде:

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) }
0 голосов
/ 02 июня 2011
external_event = ExternalEvents.new(params[:Events][:RecordSet][:Record])

Это должно создать новый экземпляр с атрибутами, совпадающими с парами ключ-значение в хэше записи, при условии, что имена ваших полей совпадают.

Используйте проверку модели на SENDER_MSISDN и наложите ограничение внешнего ключа на столбец external_events.SENDER_MSISDN.

...