【问题标题】:Delete faster 300K associated objects on activeadmin (Rails 4, Activeadmin)在 activeadmin (Rails 4, Activeadmin) 上删除更快的 300K 关联对象
【发布时间】: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


    【解决方案1】:

    你会发现:

    has_many :deal_prizes, dependent: :delete_all
    

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

    delete from deal_prizes where deal_id = 123;
    

    不会进行回调,但这只是性能魔法的一部分。

    见:Rails :dependent => :destroy VS :dependent => :delete_all

    【讨论】:

    • 哇超级高效!!顺便说一句,现在我设法创建了 300k 关联对象,并立即删除它们,例如,如果我将 Game 表上的 Prize_number 从 300K 更改为 260K,如何更新 300K 关联行?我也许可以提出另一个问题。
    • @david_aldridge 这里是更新的新问题:stackoverflow.com/questions/32553299/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多