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

次のように2段階のプロセスがあります。

  1. 人の名前を使用して、個人の記録を記入します。人の名前は、あだ名などにより不明な重複がある場合があります。たとえば、「tim smith」と「timothy smith」などです。
  2. API にクエリを実行して、それらの人々に一致する可能性のある電子メール アドレスを取得します。

その処理を行った後、次のようなデータを取得できます。

レコード 1: first_name: tim last_name: smith 電子メール: tim.smith@sampleemail.com

レコード 2: 名: ティモシー 姓: スミス 電子メール: tim.smith@sampleemail.com

それらが重複していることをレールでモデル化するための最良の方法は何ですか?

更新: 明確化

ステップ 2 の後、これらの 2 つのレコードが重複している (つまり、同一人物である) ことを確認する方法がわかりました。私の質問は、それをモデルでどのように表現するかです。「duplicate_of_person_id」タイプ フィールドを追加し、そのフィールドの最初のレコードの ID を 2 番目のレコードに入れる必要がありますか? より良い方法はありますか?

4

2 に答える 2

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 に答える