【发布时间】:2018-12-08 00:44:40
【问题描述】:
我正在尝试将这段 Rails 代码更新为原始 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 未正确更新,仍在研究如何使用 postgresql 正确拆分和 gsub。
请指教。谢谢。
【问题讨论】:
-
你的
IN是错误的,但在那之前,你为什么需要IN?,你正在更新同一个表,没有连接等。只需执行UPDATE validation_emergencies ... WHERE code = 'aml_validation_failed' AND service_name = 'ComplyAdvantage' AND service_type IS NULL -
@fanta 谢谢,你说得对。但是,我更关心
(array_upper(string_to_array(message, ', '), 1))如何拆分,以及 gsub 并从"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 返回的值,我也在做转换为 INTGER。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]。想法?
标签: ruby-on-rails postgresql ruby-on-rails-3 activerecord