在Rails中重复删除人员记录的最佳方法

时间:2013-03-26 21:53:25

标签: ruby-on-rails duplicates duplicate-data

我正在编写一个带有Person模型的rails应用程序,看起来像这样:

  create_table "people", :force => true do |t|
    t.string   "first_name"
    t.string   "last_name"
    t.string   "email"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

我有两个步骤:

  1. 用人名填写个人记录。由于昵称等原因,人们的名字可能有未知的副本。例如,“蒂姆史密斯”和“蒂莫西史密斯”
  2. 查询API以获取这些人的潜在电子邮件地址匹配。
  3. 完成该处理后,我可以获得如下数据:

    记录1: first_name:蒂姆 last_name:史密斯 电子邮件:tim.smith@sampleemail.com

    记录2: first_name:蒂莫西 last_name:史密斯 电子邮件:tim.smith@sampleemail.com

    在rails中建模那些重复的最佳方法是什么?

    更新:澄清

    在第2步之后,我知道如何找出这两个记录是重复的(即同一个人),我的问题是如何在模型中表示?我应该添加“duplicate_of_person_id”类型字段并将第一条记录的ID放在第二条记录中吗?还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以将所有记录链接在一起。想到的第一个方案是保持记录的最低id作为胜利者,并使所有的欺骗指向它。您还可以执行has_and_belongs_to_many,这将涉及一个单独的表,其中每条记录表明这两个人是相同的。然而,后者随着人数的增加而呈二次方式增长。

或者,只需将第二个中的所有信息复制到第一个中,然后删除第二个。

答案 1 :(得分:0)

不是100%肯定你要求的。如果你只是想找到重复项,并且比如在数组中列出它们,你可以创建一个这样的方法:

# This isn't particularly efficient, but it should return an array in which
# each element is a list of duplicated people (assuming we define duplicates
# by doubled email addresses). 
def self.find_duplicates
  array = []
  self.each do |person|
   similar = self.find_by_email
   if similar.count > 1
    array << similar
   end
  end
  return array
end

如果不希望允许重复,只需在模型中创建验证:

validates :email, :uniqueness => true

在此之前,请务必确保电子邮件的内容完全相同。你可以在模型中再做一次这样的事情:

before_validation :format_emails

def format_emails
  self.email = self.email.downcase
end