2015-09-13 93 views
0

創建模型Deal時,我使用after_create在DealPrize表上創建獎品。在activeadmin上刪除更快的300K關聯對象(Rails 4,Activeadmin)

Deal和DealPrize有一個屬於/ has_many的關係:一個交易有很多交易獎品和一個Dealprize屬於交易。

它的工作原理是這樣的:在Deal內部,我有一個'獎品號碼'專欄,我使用了一個after_create,這樣每次管理員創建一個新交易時,應用程序都會獲得這個獎品號碼列,並創建這個獎品(根據需要插入儘可能多的行=>通常超過300,000)在DealPrize表內。

因此,我創建一個交易,並自動,該應用程序創建大量的相關對象(獎品)說300,000。

問題是,當我刪除交易,我想刪除所有相關的獎品。使用活動管理員,我只需按'刪除',它的工作良好感謝相關::銷燬如果獎品號碼是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 

感謝您的幫助, 馬修

回答

2

你會發現:

has_many :deal_prizes, dependent: :delete_all 

...會快得多,因爲它會發出一條SQL語句:

delete from deal_prizes where deal_id = 123; 

不會做任何回調,但這只是性能魔術的所有部分。

參見:Rails :dependent => :destroy VS :dependent => :delete_all

+0

我要去嘗試感謝 – Mathieu

+0

哇超有效!順便說一下,現在我設法創建了300k個關聯對象,並且一次刪除它們,例如,如果將遊戲表上的prize_number從300K更改爲260K,我如何更新300K關聯的行?我可以創建另一個問題。 – Mathieu

+0

@david_aldridge這裏是更新的新問題:http://stackoverflow.com/questions/32553299/update-massive-number-of-rows-of-associated-objects-in-has-many-belong-to-relati – Mathieu

相關問題