删除比最新记录更旧的activerecord行

时间:2017-09-14 15:51:27

标签: ruby-on-rails ruby activerecord

我没有运行验证,因此我的数据库中有重复项。现在我需要删除比最新记录更早的记录。在Ruby中最好的方法是什么?

我这样做是为了从一家商店找到副本:

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 }

gemailscustomer_id为键返回重复项。

然后,我可以找到第一个副本的最新记录,如下所示:

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

如何摆脱共享最后一个customer_id的所有记录?

由于

1 个答案:

答案 0 :(得分:0)

首先,您可以找到您不想删除的订单的ID(最新的) - 这与您已有的相似,但使用: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

你应该在做这些事情之前复制你的数据 - 我会讨厌我做的任何错误导致你丢失数据。

此外,这可能对测试或一次性数据清理有用,但您应该在模型中使用验证来防止数据首先达到此状态。