我在某种程度上对SQL和迁移很有帮助,所以我的方法可能在这里完全错误,但请耐心等待;)
我有一个公司模型,其中包含SMTP邮件配置的属性(如smtp_address
和smtp_port
),这些属性是可选的。
但是,我现在需要我的用户模型也能够进行SMTP配置,因此我创建了一个SMTPConfiguration模型,其中包含属性address
,port
和与{{1的多态关联}}。此模型将属于用户或公司模型
我现在要做的是将我已经在公司表中已有的数据迁移到SMTP配置表,这听起来非常简单,除非我想创建一个新的SMTP配置,如果公司实际上有smtpable
和smtp_address
设置。如果smtp_port
和smtp_address
不存在,则公司不应具有所属的SMTP配置。
使用Ruby条件和ActiveRecord这很容易做到,但是从我用ActiveRecord单独插入行读取的内容对于大型数据库来说可能非常长,因此使用原始SQL更好。事实证明我吮吸SQL :(。
我已经在StackOverFlow上搜索了很多,使用this和this,我想出了类似
的内容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_at
和updated_at
,但说实话,我没有想法。 activerecord-import宝石可以用吗?
我正在使用Rails 5.1.4和Postgres 10.3
答案 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的代码。