在设计中生成有意义的用户名

我正在尝试让我的应用程序自动生成用作名称的用户名。 通常,它们将是用户的名字和姓氏一起添加,但是当已经存在具有相同名字和姓氏的用户时,它将为每个名称增加一个数字。

这是我创建的方法:

def full_name first_name + ' ' + last_name end def user_name t_user_name = first_name.downcase.strip.gsub(' ', '').gsub(/[^\w-]/, '') + last_name.downcase.strip.gsub(' ', '').gsub(/[^\w-]/, '') user_name = t_user_name num = 1 while User.find_by_user_name(user_name).count > 0 num += 1 user_name = "#{t_user_name}#{num}" end end 

我目前收到错误:

 undefined method `find_by_user_name' 

我认为哪个会自动运行?

我也试着在这篇文章中展示的例子:

生成唯一的用户名(omniauth + devise)

但我一直收到错误:

 Mysql2::Error: Unknown column 'users.login' in 'where clause': SELECT COUNT(*) FROM `users` WHERE `users`.`login` = 'bobweir' 

即使我补充道

 t.string :login, null: false, default: "" 

到users表

edit2:schema.rb

ActiveRecord :: Schema.define(版本:20150611033237)做

 create_table "users", force: :cascade do |t| t.string "first_name", limit: 255 t.string "last_name", limit: 255 t.string "email", limit: 255, default: "", null: false t.string "encrypted_password", limit: 255, default: "", null: false t.string "reset_password_token", limit: 255 t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.integer "sign_in_count", limit: 4, default: 0, null: false t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" t.string "current_sign_in_ip", limit: 255 t.string "last_sign_in_ip", limit: 255 t.datetime "created_at", null: false t.datetime "updated_at", null: false end add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree 

结束

Rails通过在方法调用中推断属性名称来实现find_by_sth魔术,从而返回ActiveRecordRelation。

由于模型中没有user_name属性,Active Record将无法对其执行搜索(只是想象它必须转换为SQL查询)。

另一方面,如果我是你,我会重新思考你的user_name方法的逻辑。 考虑在数据库上保留user_name。

顺便说一下,在你提到的第二个错误中,请注意你所拥有的示例是使用登录属性,而你根本就没有。