【问题标题】:Convert ActiveRecord query to PostgreSQL query将 ActiveRecord 查询转换为 PostgreSQL 查询
【发布时间】: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


【解决方案1】:

最终版本,对于 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"
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多