我正在编写一个带有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: first_name:蒂姆 last_name:史密斯 电子邮件:tim.smith@sampleemail.com
记录2: first_name:蒂莫西 last_name:史密斯 电子邮件:tim.smith@sampleemail.com
在rails中建模那些重复的最佳方法是什么?
更新:澄清
在第2步之后,我知道如何找出这两个记录是重复的(即同一个人),我的问题是如何在模型中表示?我应该添加“duplicate_of_person_id”类型字段并将第一条记录的ID放在第二条记录中吗?还有更好的方法吗?
答案 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