2

我正在编写一个带有 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. 用人名填写人事记录。由于昵称等原因,人名可能有未知重复。例如,“tim smith”和“timothy smith”
  2. 查询 API 以获取这些人的潜在电子邮件地址匹配项。

完成该处理后,我可以获得如下数据:

记录 1:名字:tim last_name:smith 电子邮件:tim.smith@sampleemail.com

记录 2:名字:蒂莫西姓氏:史密斯电子邮件:tim.smith@sampleemail.com

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

更新:澄清

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

4

2 回答 2

1

您可以将所有记录链接在一起。想到的第一个方案是保留 id 最低的记录作为获胜者,并让所有受骗者指向它。您也可以做一个 has_and_belongs_to_many,这将涉及一个单独的表,其中每条记录都表明这两个人是相同的。不过,后者随人数呈二次方增长。

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

于 2013-12-12T04:43:31.217 回答
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
于 2013-03-26T22:34:13.500 回答