【发布时间】:2015-09-13 18:26:03
【问题描述】:
在创建模型 Deal 时,我使用 after_create 在 DealPrize 表上创建奖品。
Deal 和 DealPrize 有属于/has_many 关系:一个 Deal 有多个 Deal 奖品,而一个 Dealprize 属于一个 Deal。
它的工作原理是这样的:在 Deal 中,我有一个“prize-number”列,并且我使用了 after_create,这样每次管理员创建新交易时,应用程序都会使用这个 Prize_number 列,并创建这个数量的奖品(在 DealPrize 表中插入尽可能多的行 => 通常超过 300,000)。
所以我创建了一个 Deal,应用程序会自动创建大量相关对象(奖品),比如 300,000 个。
问题是当我删除交易时,我想删除所有相关的奖品。使用活跃的管理员,我只需按“删除”,由于 dependent: :destroy,它可以正常工作。 如果奖品数量像 200,它可以正常工作,但对于 300K 关联对象/行,它非常慢。需要 15 分钟。
如何加快速度?如何覆盖/增强 ActiveAdmin 删除功能以更快地删除 300K 相关奖品?
我可以使用事务或批量删除吗?
模态 Deals.rb
has_many :deal_prizes, dependent: :destroy
after_create :create_deal_prizes
CONNECTION = ActiveRecord::Base.connection.raw_connection
def create_deal_prizes
begin
CONNECTION.describe_prepared('yokoatxz')
rescue PG::InvalidSqlStatementName
CONNECTION.prepare('yokoatxz', 'INSERT INTO deal_prizes (deal_id,created_at,updated_at,admin_user_id) values ($1, $2, $3, $4)')
end
Deal.transaction do
self.prizes_number.times do |i|
CONNECTION.exec_prepared('yokoatxz', [ { value: self.id},
{ value: '2009-01-23 20:21:13' },
{ value: '2009-01-23 20:21:13' },
{ value: self.admin_user_id }
] )
end
end
end
感谢您的帮助, 马修
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 postgresql activeadmin