我有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字段
答案 0 :(得分:1)
您有几个选择
执行sql ReleaseSubscription.connection.execute(“insert into transaction_queues ...”)
在交易中使用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语句,但在同一事务中运行它们。
另一个不错的选择是将匹配查询的所有内容转储到sql文件中,并使用load data in file
在sql中一次性添加所有内容。