在activeadmin上删除更快的300K关联对象(Rails 4,Activeadmin)

时间:2015-09-13 18:26:04

标签: ruby-on-rails ruby ruby-on-rails-3 postgresql activeadmin

在创建模特交易时,我使用after_create在DealPrize表上创建奖品。

Deal和DealPrize属于/ has_many关系:a Deal有许多Deal奖品,Dealprize属于Deal。

它的工作原理如下:内部交易,我有一个专栏'奖品编号'我使用了一个after_create,这样每次管理员创建一个新的交易时,应用程序都会获取此prize_number列,并在DealPrize表中创建此批量的奖品(根据需要插入多行=>通常超过300,000)。 / p>

所以我创建了一个交易,并且该应用自动创建了大量相关对象(奖品),说300,000。

问题是当我删除交易时,我想删除所有相关的奖品。使用有效的管理员,我只需按“删除”即可。由于依赖:: destroy ,它工作正常。 如果奖金数字是200,它可以正常工作,但对于300K关联的对象/行,它非常慢。需要15分钟

如何加快速度?如何覆盖/增强ActiveAdmin删除功能以删除300K相关的prizesfaster?

我可以使用交易或批量删除吗?

模式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

感谢您的帮助, 马修

1 个答案:

答案 0 :(得分:2)

您会发现:

has_many :deal_prizes, dependent: :delete_all

...会快得多,因为它会向SQL发出一条SQL语句:

delete from deal_prizes where deal_id = 123;

不会进行任何回调,但这只是表演魔术的全部内容。

请参阅:Rails :dependent => :destroy VS :dependent => :delete_all