【问题标题】:Setting user id in params在参数中设置用户 ID
【发布时间】:2016-01-22 03:44:29
【问题描述】:

我有一个 webapp,它提供了一个创建新用户的选项。但是,问题是 idUser 为 null 我必须自动生成它。

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

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

【问题讨论】:

  • id 应该是自动生成的!
  • rails(更普遍的是ruby)不使用camelCase,约定是snake_case,你不需要idUserid是rails自动提供的一列(除非你有monkeyed事物),默认情况下是自动递增的
  • 不幸的是,它不是因为我从 db 生成模型而不是相反。所以我被不自动生成的 idUsers 困住了。
  • 现有数据库中users表是如何定义的? idUser 值是如何分配给现有行的?顺便说一句,User.last.id+1 不是一个好方法,它会受到竞争条件的影响,并且如果删除行可能会产生错误的值。

标签: ruby-on-rails ruby


【解决方案1】:

在类定义中添加主键

class User << ActiveRecord::Base self.primary_key = "idUser" end

然后应该正确处理参数。

【讨论】:

    【解决方案2】:

    你可以试试这样的:

    用户.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
    

    【讨论】:

    • 这很容易出现竞争条件,所有这些工作都应该由数据库完成,而不是在您的代码中
    【解决方案3】:

    您的模式很蹩脚,但您仍需要执行以下操作之一:

    1. 将“主键”设置为idUser
    2. 拉动idUser 并手动“增加”它
    3. 使用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 - 如果你想使用 Rails 的内置 uuid functionality,你可以将 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

    【讨论】:

      猜你喜欢
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 2016-11-06
      相关资源
      最近更新 更多