【发布时间】:2018-05-16 09:14:19
【问题描述】:
总的来说,我对 SQL 和迁移有点初学者,所以我的方法可能在这里完全错误,但请耐心等待;)
我有一个公司模型,它具有 SMTP 邮件配置的属性(如 smtp_address 和 smtp_port),这是可选的。
但是,我现在需要我的 User 模型也能够进行 SMTP 配置,因此我创建了一个 SMTPConfiguration 模型,其属性为 address、port,以及与 smtpable 的多态关联。此模型将属于 User 或 Company 模型
我现在想做的是将公司表中已有的数据迁移到 SMTP 配置表中,这听起来很简单,除非我想创建一个新的 SMTPConfiguration 仅当公司实际上有 @ 987654329@ 和 smtp_port 设置。如果smtp_address 和smtp_port 不存在,则公司不应拥有所属的 SMTPConfiguration。
使用 Ruby 条件和 ActiveRecord 很容易做到这一点,但从我所读到的内容来看,使用 ActiveRecord 单独插入行对于大型数据库来说可能真的很长,因此使用原始 SQL 是一个更好的主意。原来我对 SQL 很烂 :( .
我在 StackOverFlow 上搜索了很多,使用 this 和 this,我想出了类似的东西
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 和smtpable_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 c。smtpable_type怎么可能是“用户”? :)
标签: sql ruby-on-rails data-migration rails-migrations