在我的应用中,我尝试自动填充username
字段中的first_name
列,该字段已绑定到我的Devise
登录系统。从理论上讲,它应该只是user
' first_name
如果他们是唯一一个有这个名字的人,但它应该是像#34; 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
但是,如果有更好的或更多的Ruby&#34;请告诉我。办法。任何有助于此工作的帮助将不胜感激!
答案 0 :(得分:0)
我认为你的方式是正确的,但是可以肯定地选择,你可以避免创建数组并填充所有相同名称的步骤。
另外,尝试查看是否可以在名字列上创建索引,这将优化查询。
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
注意:如果您的应用程序扩展并且拥有大量用户,那么使用这样的用户名会产生性能问题。