1

Googleのログイン/登録を備えたFacebookアプリがあります。一部のアカウントはユーザー名を提供しないため、アプリケーションはオブジェクトをデータベースに保存する前にユーザー名を作成する必要があります。

現在、この方法で問題を解決しています。

user.username = "#{user.email[/^[^@]*/]}_#{user.id.to_s}"

問題は、mongodb/mongoidlikeを使用して、次database/odmのように長すぎるユーザー名を生成することです。

hyperrjas_50ad43d11d41c86b27000066

この場合、user.idafterを追加しましたhyperrjas

ユーザー名がすでに使用されている場合は、一意の番号ではなく一意の番号を追加しidます。たとえば、次のようになります。

hyperrjas
hyperrjas1
hyperrjas2
hyperrjas3
...

どうすればいいですか?

4

3 に答える 3

2

私は以前にこれと同様の質問に答えました。これは私が思いついたものです:

https://stackoverflow.com/a/13794784/367611

コメントごとに更新

これからメソッドを作成するには、次のようにします。

def prevent_collision(user)
  name = "#{user.email[/^[^@]*/]}"
  users = User.where(:username => /^#{name}/).to_a #Return an array and after use length method with users.length. Without .to_a is not working because is returned a mongoid criteria.
  count = users.length

  if count > 0
    count = rand(1000)
    loop do
      break "#{name}#{count}" unless users.any? { |u| u.name == "#{name}#{count}" }
      count += rand(10)
    end
  else
    name
  end
end

戻り値は、最初に生成された名前か、カウントが追加された名前のいずれかになります。次に、たとえば次のようにすることができます。

@user.username = prevent_collision(@user)
@user.save
于 2012-12-13T17:44:24.220 に答える
1

多分これは便利なアイデアです:

username = "hyperrjas001"
try_name = username.dup
10.times do
  raise "username maximum reached: #{username}." if try_name.end_with('999')
  try_name = try_name.next
  puts try_name
end

# Output:
#hyperrjas002
#hyperrjas003
#hyperrjas004
#hyperrjas005
#hyperrjas006
#hyperrjas007
#hyperrjas008
#hyperrjas009
#hyperrjas010
#hyperrjas011
于 2012-12-13T17:00:58.550 に答える
0

次のようなものがインクリメントに適している可能性があります。

username.sub(/^(.*\D)(\d*)$/) { "%s%d" % [ $1, $2.to_i + 1 ] }

例として:

username = 'hyperrjas'
username2 = username.sub(/^(.*\D)(\d*)$/) { "%s%d" % [ $1, $2.to_i + 1 ] }
# => "hyperrjas1"
username3 = username2.sub(/^(.*\D)(\d*)$/) { "%s%d" % [ $1, $2.to_i + 1 ] }
# => "hyperrjas2"

一意の名前が得られるまで、必要に応じてこれを繰り返すことができます。lucky99のように名前をマングルすることに注意してください。lucky100ただし、ではありませんlucky991

于 2012-12-13T16:39:48.603 に答える