2012-02-20 4 views
2

埋め込みドキュメントのユーザー認証に問題があります。私は2つのドキュメントを持っています。ビジネスには多くのメンバーがいます。モデルは次のようになります。Rails 3とMongoid:埋め込みドキュメントの検証

class Member 
    include Mongoid::Document 

    field :username,  type: String 
    field :password,   type: String 
    embedded_in :business 

    validates :username, :presence => true, :uniqueness => true, :length => 5..60 
end 

class Business 
    include Mongoid::Document 

    field :name,   type: String 
    embeds_many :members 
end 

問題は、各モデルのユーザー名の一意性を検証していないことです。ビジネスのメンバーを保存すると、同じ名前の千を保存できます。これはもちろん、良い認証システムのために働くつもりはありません。私は、Mongoid 2使用しています3レール、およびRuby 1.9の

答えて

7

これは、ここで説明したように埋め込まれた文書を使用して正常な動作です:

検証をMongoID validation

validates_uniqueness_ofフィールドはデータベース内で一意であること: 埋め込みドキュメントの場合、これはフィールドがデータベース全体ではなく、親ドキュメントのコンテキスト内で一意であることを確認するだけであることに注意してください。

あなたは、そのコレクションのすべてのオブジェクト間の一意性を保証するインデックスをユーザー名フィールドに作成しようとします。このような何か:

ensureIndex({username:1},{unique:true}); 

EDIT:あなたは同じインデックス値を持つ文書が存在する場合、モンゴが例外をスローする場合は、パターンを「火をし、忘れる」を行うためにモンゴを避けなければなりません。これは、ドキュメントに対して更新/書き込み操作を実行すると、データベースが応答を待たないことを意味します。

そして、このパラメータを渡したい:safe:true。そうすれば、何らかの理由で文書を挿入できない場合、Mongoは例外を発生させるべきです。

+0

ありがとう、私はちょうどそれを逃した必要があります。だから私はインデックスを置くとそれは働いた。唯一の問題は、同じユーザー名のうちの2つを持つものを保存すると、(検証に合格するため)trueと表示され、保存されないということです。 falseを返すsave関数を取得する人はいますか? – Red

+0

これは本当に良い点です。私はいくつかの研究をしてきました。私はあなたが安全に渡すことができると信じています。本当です。それが助けになります。答えの私の編集を見てください:) – Nobita

関連する問題