3

私のユーザーモデルはかなり標準的です-email:string列があり、validates:email、:unique=>trueを使用してユーザーモデルでこれの一意性を検証します。

ユーザーに代替メールアドレスを許可するために、新しいモデルを作成しました。

列user_id:integerおよびemail:stringを持つAlternateAddress。

ユーザーhas_manyAlternateAddresses、およびAlternateAddressはユーザーに属しています。 この設定により、次のような単純なネストされたフォームが作成されます:http: //railscasts.com/episodes/196-nested-model-form-part-1

2つのemail:string列(1つはUser.rbにあり、もう1つはAlternateAddress.rbにある)を「一緒に」検証する必要があることに気付きました。したがって、重複する電子メールアドレスはどこにもありません。

どうすればいいですか?または、私の方法論全体がオフになっていますか?

前もって感謝します。

4

2 に答える 2

2

すでにいくつかの電子メールアドレスを別のモデルに保存している場合は、それらすべてをその別のモデルに保存しemailて、モデルからフィールドUserを完全に削除してみませんか?

このようにして、一意性の制約をすべて1つの場所(AlternateAddressモデル)に保持できます。AlternateAddress1つの電子メールアドレスの「プライマリ」の側面は、特定ののいずれかのesのフラグとして簡単に保持できますUser

于 2012-08-06T01:54:26.340 に答える
2

カスタムバリデーターを追加して、ユーザーテーブルをチェックしてから、代替アドレステーブルをチェックすることができます。

class User < ActiveRecord::Base
  validate :email_uniqueness # custom
  validates :email, :uniqueness => true

  def email_uniqueness
    if AlternateAddress.find_by_email(self.email)
      self.errors.add(:email, "is already in use by another account")
    end
  end
end

AlternativeAddressフィールドに似たものを追加できます。このメソッドは、代替アドレスを処理するカスタムバリデーターですが、ユーザー間の一意性のために通常のRailsバリデーターが必要です。

于 2012-08-06T02:02:07.120 に答える