創建模型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
感謝您的幫助, 馬修
我要去嘗試感謝 – Mathieu
哇超有效!順便說一下,現在我設法創建了300k個關聯對象,並且一次刪除它們,例如,如果將遊戲表上的prize_number從300K更改爲260K,我如何更新300K關聯的行?我可以創建另一個問題。 – Mathieu
@david_aldridge這裏是更新的新問題:http://stackoverflow.com/questions/32553299/update-massive-number-of-rows-of-associated-objects-in-has-many-belong-to-relati – Mathieu