我没有运行验证,因此我的数据库中有重复项。现在我需要删除比最新记录更早的记录。在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 }
gemails
以customer_id
为键返回重复项。
然后,我可以找到第一个副本的最新记录,如下所示:
Customer.where(customer_id: gemails.keys[0]).order("updated_at").last
如何摆脱共享最后一个customer_id
的所有记录?
由于
答案 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
你应该在做这些事情之前复制你的数据 - 我会讨厌我做的任何错误导致你丢失数据。
此外,这可能对测试或一次性数据清理有用,但您应该在模型中使用验证来防止数据首先达到此状态。