使用ActiveRecord将一个模型快照到另一个模型

时间:2017-03-13 22:09:48

标签: ruby-on-rails activerecord

我有3个模型:Project,MonthlySubscription(订阅的sti)和MonthlyTransactionQueue(TransactionQueue的sti)。订阅和TransactionQueue belong_to项目。

我想创建MonthlySubscription的副本,并将其放入MonthlyTransactionQueue,对于具有Release.released = false的项目。我如何使用AR?

我的sql看起来像这样:

insert into transaction_queues
select a.*, b.id as release_id
 from subscriptions a
 left join releases b
  on a.project_id = b.project_id
 where b.released = false
 and a.type = 'ReleaseSubscription'

对于AR,我已经开始使用此ReleaseSubscription.joins(project: :releases),但它没有保留Release.released字段

1 个答案:

答案 0 :(得分:1)

您有几个选择

  1. 执行sql ReleaseSubscription.connection.execute(“insert into transaction_queues ...”)

  2. 在交易中使用AR。

    MonthlyTransactionQueue.transaction do
     # I'm unsure what Release.released is and how it relates but this should work other than that.
      MonthlySubscription.where(released: false).each do |sub| 
       MonthlyTransactionQueue.create(sub.attributes)
     end
    end
    

    这将创建多个insert语句,但在同一事务中运行它们。

  3. 另一个不错的选择是将匹配查询的所有内容转储到sql文件中,并使用load data in file在sql中一次性添加所有内容。