我有一个webapp,可以选择创建新用户。但是,问题是idUser
为空我必须自动生成它。
如何设置:idUser
?我有一个使用User.last.id+1
的想法,但我在实施它时遇到了麻烦。
def user_params
params.require(:user).permit(:name, :surname, :email, :password, :userName, :idUser)
end
答案 0 :(得分:1)
在班级定义中添加主键
class User << ActiveRecord::Base
self.primary_key = "idUser"
end
然后应该正确处理参数。
答案 1 :(得分:1)
您可以尝试以下方式:
User.rb
before_create :generate_reference
private
def generate_id
self.reference = loop do
token = SecureRandom.urlsafe_base64(nil, false)[0..19]
break token unless Request.exists?(reference: token)
self.idUser = token
end
end
答案 2 :(得分:0)
你的模式相当蹩脚,但你仍然希望做以下其中一种:
idUser
idUser
并“递增”UUID
功能 1 - 在您的数据库中,您可以将primary_key
设置为idUser
,应允许您提供自动增量功能:
$ rails g migration AddPrimaryKey
# db/migrate/add_primary_key______.rb
class AddPrimaryKey < ActiveRecord::Migration
def self.up
execute "ALTER TABLE users modify `idUser` id int(8) AUTO_INCREMENT"
execute "ALTER TABLE users ADD PRIMARY KEY (idUser);"
end
def self.down
execute "ALTER TABLE users modify `idUser` id int(8)"
end
end
$ rake db:migrate
来自this answer的明智建议:
使用内置
id
字段作为主键。如果你要使用Rails,你应该用“Rails方式”构建你的应用程序,除非你有充分的理由不这样做。
-
2 - 您可以使用this answer:
#app/models/user.rb
class User < ActiveRecord::Base
before_create :set_id, if: "idUser.blank?"
private
def set_id
self[:idUser] = User.maximum(:idUser).next
end
end
-
3 - 如果您想使用内置的uuid
functionality Rails,您可以将idUser
设置为主键(上图),但不要将其设置为自动增量,将它设为字符串并向其添加UUID
生成器:
# db/migrate/add_primary_key______.rb
class AddPrimaryKey < ActiveRecord::Migration
def self.up
execute "ALTER TABLE users ADD PRIMARY KEY (idUser);"
if Rails.env.staging? #-> Heroku PGSQL
execute("CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\"")
else #-> MYSQL
execute("DROP TRIGGER IF EXISTS before_insert_users;");
execute("CREATE TRIGGER before_insert_nodes BEFORE INSERT ON users FOR EACH ROW SET new.uuid = uuid();")
end
end
end
#app/models/user.rb
class User < ActiveRecord::Base
set_primary_key "idUser"
end
这样您就可以像使用id
/ uuid
列一样使用rails,ActiveRecord
根据需要引用idUser
。