Rails with Devise:根据名字设置唯一的用户名
Rails with Devise: Set Unique Username from First Name
在我的应用程序中,我试图自动填充 first_name
字段中的 username
列,我已经绑定到我的 Devise
登录系统。理论上,如果只有 user
的 first_name
有这个名字,它应该只是 first_name
,但如果有的话,它应该是 "Mal the 4th" 或 "Jayne the 3rd"其他 users
已经有了这个名字。
到目前为止,在谷歌搜索和咨询其他 SO 帖子(比如 this 一个)时,我的 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
但我正在努力填补空白。到目前为止,看起来最好的方法是做一个 if 语句来检查 first_name
是否是唯一的,如果不是 ordinalize
某种 count
,但是请如果有更好的或 "more Ruby" 方法,请告诉我。任何帮助让它工作的人都将不胜感激!
我认为你的方法是正确的,但是肯定可以优化,你可以避免创建数组并填充所有相同名称的步骤。
此外,尝试查看是否可以在名字列上创建索引,这将优化查询。
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
Note: having user names likes this will create performance issues when your application scales and has large number of users.
在我的应用程序中,我试图自动填充 first_name
字段中的 username
列,我已经绑定到我的 Devise
登录系统。理论上,如果只有 user
的 first_name
有这个名字,它应该只是 first_name
,但如果有的话,它应该是 "Mal the 4th" 或 "Jayne the 3rd"其他 users
已经有了这个名字。
到目前为止,在谷歌搜索和咨询其他 SO 帖子(比如 this 一个)时,我的 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
但我正在努力填补空白。到目前为止,看起来最好的方法是做一个 if 语句来检查 first_name
是否是唯一的,如果不是 ordinalize
某种 count
,但是请如果有更好的或 "more Ruby" 方法,请告诉我。任何帮助让它工作的人都将不胜感激!
我认为你的方法是正确的,但是肯定可以优化,你可以避免创建数组并填充所有相同名称的步骤。
此外,尝试查看是否可以在名字列上创建索引,这将优化查询。
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
Note: having user names likes this will create performance issues when your application scales and has large number of users.