指定された名前に基づいてユーザー名を作成しようとしています。多くの人が「ジョン」と名付けられているので、何らかの方法でこれを確認し、+1 カウントに従って作成する必要があります。
この場合、 ActiveRecord を反復して というユーザー名を見つける方法に少し迷っています。john
既に存在する場合は試しjohn1
てみて、利用できない場合は試してみてくださいjohn2
。使用すると思いますwhile
が、この場合に反復する方法がわかりません。
これを行う方法はありますか?
指定された名前に基づいてユーザー名を作成しようとしています。多くの人が「ジョン」と名付けられているので、何らかの方法でこれを確認し、+1 カウントに従って作成する必要があります。
この場合、 ActiveRecord を反復して というユーザー名を見つける方法に少し迷っています。john
既に存在する場合は試しjohn1
てみて、利用できない場合は試してみてくださいjohn2
。使用すると思いますwhile
が、この場合に反復する方法がわかりません。
これを行う方法はありますか?
データベースに何度もアクセスしないようにするには、名前に一致するユーザーのリストを取得し、ユーザーの数を確認し、その数を名前に追加してから、既に読み込まれているコレクションで新しい名前を確認します。
次のようになります。
name = params[:name]
users = User.where(User.arel_table[:name].matches("#{params[:name]}%")).to_a
count = users.length
name_without_collision = if count > 0
loop do
break "#{name}#{count}" unless users.any? { |u| u.name == "#{name}#{count}" }
count += 1
end
else
name
end
を呼び出しto_a
ているActiveRecord::Relation
ので、データベースが標準のRuby配列に変換されているため、誤って複数のクエリをデータベースに送信することを心配する必要はありません。