【问题标题】:How do I insert data only if it matches a certain condition from one table to another table in Rails?仅当数据与Rails中的一个表中的某个条件匹配到另一个表时,如何插入数据?
【发布时间】:2018-05-16 09:14:19
【问题描述】:

总的来说,我对 SQL 和迁移有点初学者,所以我的方法可能在这里完全错误,但请耐心等待;)

我有一个公司模型,它具有 SMTP 邮件配置的属性(如 smtp_addresssmtp_port),这是可选的。

但是,我现在需要我的 User 模型也能够进行 SMTP 配置,因此我创建了一个 SMTPConfiguration 模型,其属性为 addressport,以及与 smtpable 的多态关联。此模型将属于 User 或 Company 模型

我现在想做的是将公司表中已有的数据迁移到 SMTP 配置表中,这听起来很简单,除非我想创建一个新的 SMTPConfiguration 仅当公司实际上有 @ 987654329@ 和 smtp_port 设置。如果smtp_addresssmtp_port 不存在,则公司不应拥有所属的 SMTPConfiguration。

使用 Ruby 条件和 ActiveRecord 很容易做到这一点,但从我所读到的内容来看,使用 ActiveRecord 单独插入行对于大型数据库来说可能真的很长,因此使用原始 SQL 是一个更好的主意。原来我对 SQL 很烂 :( .

我在 StackOverFlow 上搜索了很多,使用 thisthis,我想出了类似的东西

execute <<-SQL
  INSERT INTO smtp_configurations (address, port, smtpable_id)
  SELECT (c.smtp_address, c.smtp_port, c.id)
  FROM companies c
  WHERE c.smtp_address <> NULL
SQL

这行不通,因为它没有设置created_atupdated_atsmtpable_type,但老实说我没有想法。 activerecord-import gem 有用吗?

我正在使用 Rails 5.1.4 和 Postgres 10.3

【问题讨论】:

  • smtpable_type 是什么?我可以提供示例,但需要了解如何在您的应用中获取该列
  • 我说得对吗smtpable_type 总是“公司”?
  • @PavelMikhailyuk smtpable_type 是多态关联的类型。不一定是公司,也可以是用户
  • @PavelMikhailyuk 该列存在是因为我的 SMTPConfiguration 表具有以下参考:t.references :smtpable, polymorphic: true, index: true
  • 你可以SELECT ... FROM companies csmtpable_type 怎么可能是“用户”? :)

标签: sql ruby-on-rails data-migration rails-migrations


【解决方案1】:

在您的迁移中尝试下一个代码:

created_at = Time.current.to_s(:db)
insert_clause = <<-SQL
  INSERT INTO smtp_configurations(
    smtpable_id,
    smtpable_type,
    address,
    port,
    created_at,
    updated_at
  )
  SELECT
    c.id,
    'Company',
    c.smtp_address,
    c.smtp_port,
    '#{created_at}',
    '#{created_at}'
  FROM companies c
  WHERE (c.smtp_address IS NOT NULL) AND (c.port IS NOT NULL)
SQL

execute(insert_clause)

更新:更改了普通 Rails 的代码。

【讨论】:

  • 感谢您这么快回答 Pavel :) 我收到以下错误:PG::SyntaxError: ERROR: syntax error at or near ":" :smtpable_type
  • 工作就像一个魅力,非常感谢您的快速回答:)
猜你喜欢
  • 2015-10-27
  • 2015-08-05
  • 1970-01-01
  • 2021-10-31
  • 2017-08-22
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
相关资源
最近更新 更多