Rails作业合并具有相似电话号码的记录



我有一个Postgres数据库,其中有成千上万的用户记录,每个记录都有一个电话号码。但是,有许多具有相同电话号码的重复用户,但是其中一条记录可能缺少国家代码。例如:

{name: "User1", phone: "1-123-456-7890"}{name: "User1", phone: "123-456-7890"}

这两个用户是同一个人,但是一个记录有国家代码,另一个没有。我想合并这些记录,保留电话号码和国家代码。我的目标是创建一个Rails Job来查找基于电话号码的所有相似匹配。但是,用户电话号码的长度取决于国家代码(美国/加拿大= +1,阿根廷= +54)。由于所有电话号码的最小长度为10位,因此我打算按每个电话号码的最后10位数字进行查询。如果有匹配,我将合并这些记录。

我正在构建查询的过程中,但我有一些困难得到所有的匹配。这是我目前为止的活动作业:

class MergeRecordsJob < ApplicationJob
queue_as :default
def perform(user)
matches = User.where("phone LIKE ?", user[user.length * -1..-1])
p "There are #{matches.count}"
end
end

我的方向对吗?我可以在我的终端中调用这个Job,样本大小大约为1000条记录,我知道这些记录包含重复。一旦找到这些重复项,您建议我如何合并它们?

任何帮助或建议将不胜感激!

要找到您的重复,您应该能够这样做:

dup_accts = User.group('RIGHT(phone, 10)').having("count(RIGHT(phone, 10)) > 1").count

假设"phone"是存储电话号码的列的名称。这与右边的10位数字匹配,因此它将忽略国家代码。你会得到一个包含所有重复数的散列,以及重复数的计数。即2035551212 => 3。然后,您可以遍历每个重复的号码,以查找重复的实际用户。

User.where('RIGHT(phone, 10) = ?', 2035551212)

返回一个包含重复用户记录的数组…

=> [#<User:0x00007f7bd4ab5c50
id: 13625,
phone: '12035551212'
...>,
#<User:0x00007f7bd4ab5ac0
id: 13645,
phone: '2035551212'
...>]

现在你只需要弄清楚你想如何处理它们。我建议使用一种不会消耗服务器资源的作业。我也会一次处理一个,而不是试图将它们全部加载到内存中。根据dup_accts返回的大小,您可以获取它,然后通过电话号码迭代它们。或者如果它很大,你可以把它们分成几块,比如…

dup_accts.each_slice(1000) do |dup_chunk|
dup_chunk.each do |k,v|   #you only really need the key but it's a hash
User.where('RIGHT(phone, 10) = ?', k)
#returns an array of user records as noted above.
#this is where you do your duplicate removal procedure, whatever
#you determine that to be. 
end
end

如果电话号码是决定用户是谁的因素(即不是电子邮件地址或用户名),那么你可以尝试通过电话或电子邮件通知他们,他们有重复的帐户。但是,如果有两个不同的用户以两种格式输入相同的数字,无论是无意的还是故意的,那么问题就大了。如果删除重复项没有问题,那么您只需要提出一个过程,将任何子记录附加到您保存的记录。但是这个答案至少可以让您获得重复电话号码列表和相关帐户。

最新更新