2017-09-14 44 views
0

我沒有運行驗證,因此我在我的數據庫中有重複項。現在我需要刪除比最新記錄更早的記錄。在Ruby中這樣做的最好方法是什麼?刪除比最新記錄更早的activerecord行

我這樣做是爲了只從一個商店找到的DUP:

customers = Shop.find(105).customers 
emails = customers.pluck(:shop_id, :id, :customer_id, :email, :created_at, :credit_amount) 
gemails = emails.group_by{ |shop_id, id, customer_id, email, created_at, credit_amount_to_f| customer_id } 
gemails.delete_if{ |_, v| v.compact.size <= 1 } 

gemails返回與customer_id爲重點複本。

然後我就可以找到最近期的這樣的第一重複記錄:

Customer.where(customer_id: gemails.keys[0]).order("updated_at").last 

如何擺脫所有共享customer_id是不是最後一個記錄?

感謝

回答

0

首先,你可以找到你不想刪除(最近)的順序的編號 - 這類似於你已經擁有,但它更有效地使用:desc訂購記錄的方式,最新(最高日)是第一個,這樣你可以使用limit(1).first

customer_id = gemails.keys[0] 
first_order_id = Customer.where(customer_id: customer_id).order(updated_at: :desc).limit(1).first.id 

,那麼你可以刪除所有不共享相同的訂單ID的客戶的訂單:

Customer.where(customer_id: customer_id).where.not(id: first_order_id).delete_all 

在做這些事情之前,你應該製作一份你的數據的副本 - 我會討厭我犯的任何錯誤,導致你丟失數據。

這也是一種可能對測試或一次性數據清理有用的事情,但您應該在模型中使用驗證來防止數據首先進入此狀態。