2016-09-03 2 views
0

私のアプリでは、すでにDeviseログインシステムに結びついているfirst_nameフィールドからusername列を自動的に入力しようとしています。理論的には、その名前の唯一の人はuserfirst_nameでなければなりませんが、その最初の名前を持つusersがすでに存在する場合は、 "Mal 4th"または "Jayne the 3rd"のようになります。Rails with Devise:一意のユーザー名をファーストネームから設定する

はこれまでのところ、SO(this 1のような)記事をグーグルやその他のコンサルティングに私は私のregistrations_controllerに、この基本構造を持っている:

before_create :set_username 

    private 
    def set_username 
    @users = User.where(first_name == self.first_name) 
    same_first_name_array = [] 
    @users.each do |u| 
     same_first_name_array << u.first_name 
    end 

    if same_first_name_array.size = 0 
     self.username = first_name 
    else 
     self.username = first_name + " the " + ordinalize(same_first_name_array.size + 1) 
    end 
    end 

しかし、私は空白を埋めるのに苦労しています。これまでのところ、最良の方法は、first_nameが一意であるかどうかをチェックするif文を実行することです。は、countのようなものではありませんが、より優れた "Ruby"方法。これを動作させる助けがあれば歓迎されます!

+0

は、なぜオープンソース-IOS @ –

+0

あるオープンソース-IOS @クライアントがそのように要求されたユーザ名に、代わりにspecifiyingのランダムな文字列を追加していけない、私はへの可能な解決策を追加しましたOP。あなたはそれが新しい情報を与えられてそれを動作させる方法を考えることができますか? – Liz

+0

...あなたは、ユーザーの数は、それが – Liz

答えて

0

私はあなたのやり方が正しいと思っていますが、確かにoptmizedすることができます、あなたは配列を作成し、すべての同じ名前を入力するステップを避けることができます。

また、ファースト・ネームの列に索引を作成できるかどうかを確認すると、照会が最適化されます。

self.username既にユーザーが入力した名前を指していますが、複数の出現がある場合にのみそれを変更して、if/elseの必要はありません。複数のオカレンスがある場合にのみ変更してください。

あなたは

before_create :set_username 

     private 
     def set_username 
     @users = User.where(first_name == self.first_name) 
     self.username = @users.count.eql?(0) ? self.first_name : first_name + " the " + ordinalize(@users.count + 1) 
     end 

注意以下のようにそれを書き換えることができます持つユーザー名は、このときにアプリケーションのスケールパフォーマンスの問題を作成して、多数のユーザーを持っていますが好きです。

+0

'first_name'と' username'は異なる列なので、一意のファーストネームのユーザーにはまだ 'if'ステートメントが必要だと思いますが、残りははるかに優れています。また、最初の名前のクエリでインデックスを作成することはどういう意味ですか? – Liz

+0

私はコードが更新されているかどうかをチェックします。if/elseの代わりに、インデックスではMySQLがあなたのDBであると仮定してmysqlインデックスを意味します –

関連する問題