如果数据只匹配Rails中一个表到另一个表的某个条件,我该如何插入数据?

时间:2018-05-16 09:14:20

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

我在某种程度上对SQL和迁移很有帮助,所以我的方法可能在这里完全错误,但请耐心等待;)

我有一个公司模型,其中包含SMTP邮件配置的属性(如smtp_addresssmtp_port),这些属性是可选的。

但是,我现在需要我的用户模型也能够进行SMTP配置,因此我创建了一个SMTPConfiguration模型,其中包含属性addressport和与{{1的多态关联}}。此模型将属于用户或公司模型

我现在要做的是将我已经在公司表中已有的数据迁移到SMTP配置表,这听起来非常简单,除非我想创建一个新的SMTP配置,如果公司实际上有smtpablesmtp_address设置。如果smtp_portsmtp_address不存在,则公司不应具有所属的SMTP配置。

使用Ruby条件和ActiveRecord这很容易做到,但是从我用ActiveRecord单独插入行读取的内容对于大型数据库来说可能非常长,因此使用原始SQL更好。事实证明我吮吸SQL :(。

我已经在StackOverFlow上搜索了很多,使用thisthis,我想出了类似

的内容
smtp_port

这不会起作用,因为它没有设置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_at,但说实话,我没有想法。 activerecord-import宝石可以用吗?

我正在使用Rails 5.1.4和Postgres 10.3

1 个答案:

答案 0 :(得分: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的代码。