将导轨的默认 ID 替换为自定义 ID


Rails 5.1
Devise
Devise Invitable

在models/concern/shared.rb中,我有:

module Shared
  extend ActiveSupport::Concern
  def generate_model_id
    self.id = "#{self.class.name}.#{Time.now.to_f.to_s}" if id.blank?
  end  

在我的create_usres迁移文件中,我有:

class DeviseCreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users, id: false  do |t|
      t.column :id, :primary_string

在我的模型/user.rb 中,我有:

class User < ActiveRecord::Base
  include Shared
  enum role: [:user, :vip, :admin]
  after_initialize :set_default_role, :if => :new_record?
  devise :invitable, :database_authenticatable, :registerable,
        :recoverable, :rememberable, :trackable, :validatable

在我的seeds.rb文件中,我有:

user = User.new(
    :email =>'myemail@mydomain.com',
    :password =>'xK#986754',
    :password_confirmation =>'xK#986754',
    :first_name =>'John',
    :last_name =>'Doe',
    :role => 1,
    :approved => true
)
user.skip_invitation
user.save         

我已经导出了所有 Devise 模型(确认、邀请、密码、注册、会话、解锁),并将相应的控制器放在控制器/用户文件夹下。

我从哪个控制器调用 generate_model_id 方法,以及在哪里调用?

我希望您可以在使用活动记录回调创建的模块 - shared.rb 中执行此操作。

module Shared
  extend ActiveSupport::Concern
  included do
    before_save :generate_model_id
  end
  def generate_model_id
   self.id = "#{self.class.name}.#{Time.now.to_f.to_s}" if id.blank?
  end
end

在此处阅读有关主动支持回调的更多信息。

相关 SO 问题谢谢。

最新更新