在params中设置用户ID

时间:2016-01-22 03:44:30

标签: ruby-on-rails ruby

我有一个webapp,可以选择创建新用户。但是,问题是idUser为空我必须自动生成它。

如何设置:idUser?我有一个使用User.last.id+1的想法,但我在实施它时遇到了麻烦。

def user_params
  params.require(:user).permit(:name, :surname, :email, :password, :userName, :idUser)
end

3 个答案:

答案 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)

你的模式相当蹩脚,但你仍然希望做以下其中一种:

  1. 将“主键”设置为idUser
  2. 手动拉idUser并“递增”
  3. 使用UUID功能
  4. 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