2017-09-14 40 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 

在做这些事情之前,你应该制作一份你的数据的副本 - 我会讨厌我犯的任何错误,导致你丢失数据。

这也是一种可能对测试或一次性数据清理有用的事情,但您应该在模型中使用验证来防止数据首先进入此状态。