在 activeadmin 上删除更快的 300K 关联对象(Rails 4,Activeadmin)
Delete faster 300K associated objects on activeadmin (Rails 4, Activeadmin)
创建模型交易时,我使用 after_create 在 DealPrize table 上创建奖品。
Deal和DealPrize有属于to/has_many的关系:一个Deal有多个Deal奖品,一个Dealprize属于一个Deal。
它是这样工作的:在 Deal 中,我有一个列 'prize-number' 并且我使用了一个 after_create 这样每次管理员创建一个新的交易时,应用程序都会使用这个 prize_number 列,并在 DealPrize table.
中创建此数量的奖品(根据需要插入尽可能多的行=> 通常超过 300,000)
所以我创建了一个 Deal,然后应用程序自动创建了大量关联对象(奖品),比如 300,000 个。
问题是当我删除 Deal 时,我想删除所有关联的奖品。使用活动管理员,我只需按 'delete',由于 dependent::destroy,它工作正常。 如果奖品号码是 200,它工作正常,但对于 300K 关联 objects/rows,它非常慢。耗时15分钟.
我怎样才能加快速度?我怎样才能 override/boost 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 (, , , )')
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
感谢您的帮助,
马修
你会发现:
has_many :deal_prizes, dependent: :delete_all
... 会快得多,因为它会发出 SQL 语句到:
delete from deal_prizes where deal_id = 123;
不会进行任何回调,但这只是性能魔法的一部分。
参见:Rails :dependent => :destroy VS :dependent => :delete_all
创建模型交易时,我使用 after_create 在 DealPrize table 上创建奖品。
Deal和DealPrize有属于to/has_many的关系:一个Deal有多个Deal奖品,一个Dealprize属于一个Deal。
它是这样工作的:在 Deal 中,我有一个列 'prize-number' 并且我使用了一个 after_create 这样每次管理员创建一个新的交易时,应用程序都会使用这个 prize_number 列,并在 DealPrize table.
中创建此数量的奖品(根据需要插入尽可能多的行=> 通常超过 300,000)所以我创建了一个 Deal,然后应用程序自动创建了大量关联对象(奖品),比如 300,000 个。
问题是当我删除 Deal 时,我想删除所有关联的奖品。使用活动管理员,我只需按 'delete',由于 dependent::destroy,它工作正常。 如果奖品号码是 200,它工作正常,但对于 300K 关联 objects/rows,它非常慢。耗时15分钟.
我怎样才能加快速度?我怎样才能 override/boost 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 (, , , )')
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
感谢您的帮助, 马修
你会发现:
has_many :deal_prizes, dependent: :delete_all
... 会快得多,因为它会发出 SQL 语句到:
delete from deal_prizes where deal_id = 123;
不会进行任何回调,但这只是性能魔法的一部分。
参见:Rails :dependent => :destroy VS :dependent => :delete_all