Я пытаюсь обновить этот кусок кода рельсов до необработанного PostgreSQL
ValidationEmergency.with_deleted.where(
code: 'aml_validation_failed',
service_name: 'ComplyAdvantage', service_type: nil).each do |e|
e.update_attributes(
{
service_type: 'Screening',
service_id: e.message.split(', ').last.split(' => ').last.to_i
}, without_protection: true
)
end
что у меня есть до сих пор (отредактировано после комментария @fanta)
ActiveRecord::Base.connection.execute("
UPDATE validation_emergencies
SET
service_type = 'Screening',
service_id = (
CAST ( array_upper(string_to_array(message, ' => '), 1) AS INTEGER )
)
WHERE
code = 'aml_validation_failed'
AND
service_name = 'ComplyAdvantage'
AND
service_type IS NULL"
)
Тип службы обновляется правильно, но service_id - нет, все еще изучаем, как правильно разделить и gsub с помощью postgresql.
Пожалуйста, порекомендуйте. Спасибо.
@fanta, спасибо, ты прав. Тем не менее, меня больше беспокоит (array_upper(string_to_array(message, ', '), 1)), как разделить, и gsub и получить integet из сообщения, подобного этому "exception_message => Japan user, POA confirmation required. Comply Advantage API screening 0 positive hits, screening_id => 329", я хочу получить 329 в поле service_id
разделенный =>, как (array_upper(string_to_array(message, '=> '), 1))
@fanta split by => определенно отличная идея .. Я как бы забыл, что могу разделить строку любым символом, а не только ,. Я также выполняю преобразование в INTGER для значения, возвращаемого split. UPDATE validation_emergencies SET service_type = 'Screening', service_id = CAST ((array_upper(string_to_array(message, ' => '), 1)) AS INTEGER) WHERE code = 'aml_validation_failed' AND service_name = 'ComplyAdvantage' and service_type IS NULL, но, в конце концов, я все равно ошибаюсь service_id [4, 3, 3, 3, 3, 3, 2, хотя должен быть [287, 329, 331, 352, 381, 411, 413, 438, 439, 443, 444, 446]. идеи?





Окончательная версия для service_id разделит сообщение, получит последний элемент и преобразует его в целое число.
ActiveRecord::Base.connection.execute(
"UPDATE validation_emergencies
SET
service_type = 'Screening',
service_id =
CAST ((string_to_array(message, ' => '))[array_upper(string_to_array(message, ' => '), 1)] AS INTEGER)
WHERE
code = 'aml_validation_failed'
AND
service_name = 'ComplyAdvantage'
AND
service_type IS NULL"
)
ваш
INнеправильный, но перед этим зачем вамIN?, вы обновляете ту же таблицу, никаких объединений и т. д. Просто сделайтеUPDATE validation_emergencies ... WHERE code = 'aml_validation_failed' AND service_name = 'ComplyAdvantage' AND service_type IS NULL