You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails中同一客户项目跟踪号自增失效问题求助

Rails自动编号系统自增失效问题

我是Rails新手,正在学习开发。我试图在Rails应用中实现自动编号系统:创建项目时,希望从选中客户的t.integer "last_tracking_number_option1", default: 0字段获取最后使用的编号,由User模型生成跟踪号并传递给ProjectsController的create方法。但跟踪号的自增功能始终不生效——目前代码能生成类似IDEN23-01的跟踪码,但同一客户创建新项目时,序号应从01变为02,却始终保持01。

现有代码实现

Client模型

class Client < ApplicationRecord
  belongs_to :user
  has_many :projects, :dependent => :destroy
  validates :name, presence: true
  before_save :set_code
  
  def set_code
    if name.present?
    self.code = name.parameterize.upcase.slice(0, 5)
    end
  end
end

User模型

class User < ApplicationRecord
   # Include default devise modules. Others available are:
   # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
   devise :database_authenticatable, :registerable,
          :recoverable, :rememberable, :validatable
 
   has_many :projects
   has_many :clients
   has_many :rates
   has_one :user_setting
 
   enum role: [:user, :admin]
   after_initialize :set_default_role, if: :new_record?
 
   attribute :last_tracking_number_for_option1, :integer, default: 0

   # 获取并更新各选项的最后跟踪编号
   def last_tracking_number_option1
     self.last_tracking_number_for_option1 || 0
   end
 
   def update_last_tracking_number_option1(number)
     self.update(last_tracking_number_for_option1: number)
   end
 
   # 生成各选项的跟踪编号
   def generate_tracking_number_option1(client_id)
    last_number = last_tracking_number_option1
    year = Date.today.year.to_s.slice(2, 2)
    number = format('%02d', last_number + 1)
    update_last_tracking_number_option1(last_number + 1)
    "#{client_id}#{year}-#{number}"
  end
end

ProjectsController#create方法

def create
    @project = current_user.projects.build(project_params)
    @client = Client.find_by(id: params[:project][:client_id])
  
    # 根据选中选项使用对应的跟踪号生成方法
    if @client.nil?
      @project.tracking_number = current_user.generate_tracking_number_option1("", last_tracking_number_option1)
    else
      @project.tracking_number = current_user.generate_tracking_number_option1(@client.set_code)
    end
  
    respond_to do |format|
      if @project.save
        format.html { redirect_to project_url(@project), notice: "Project was successfully created." }
        format.json { render :show, status: :created, location: @project }
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @project.errors, status: :unprocessable_entity }
      end
    end
  end

控制台保存的项目对象信息

[#<Project:0x0000000105faf860                                      
  id: 12,                                                          
  name: "mmmmmmm",                                                 
  description: "mmmmmmmm",                                         
  status: "Active",                                                
  project_type: "3D Sculpture",                                    
  client_id: 2,                                                    
  user_id: 2,                                                      
  created_at: Thu, 18 May 2023 14:02:40.006548000 UTC +00:00,       
  updated_at: Thu, 18 May 2023 14:02:40.009469000 UTC +00:00,       
  tracking_number: "IDENT23-01">] 

注:问题核心在于,无论创建多少个同一客户的项目,跟踪号的序号始终停留在01,没有自增。

终端请求日志

Started POST "/projects" for ::1 at 2023-05-19 08:47:34 -0500
Processing by ProjectsController#create as TURBO_STREAM
  Parameters: {"authenticity_token"=>"[FILTERED]", "project"=>{"client_id"=>"2", "name"=>"deede", "description"=>"sdsads", "status"=>"Active", "project_type"=>"3D Sculpture"}, "commit"=>"Create Project"}
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 2], ["LIMIT", 1]]
  Client Load (0.2ms)  SELECT "clients".* FROM "clients" WHERE "clients"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  ↳ app/controllers/projects_controller.rb:38:in `create'
  TRANSACTION (0.1ms)  BEGIN
  ↳ app/models/user.rb:24:in `update_last_tracking_number_option1'
  Client Load (0.2ms)  SELECT "clients".* FROM "clients" WHERE "clients"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  ↳ app/models/user.rb:24:in `update_last_tracking_number_option1'
  User Update (0.4ms)  UPDATE "users" SET "updated_at" = $1 WHERE "users"."id" = $2  [["updated_at", "2023-05-19 13:47:34.307757"], ["id", 2]]
  ↳ app/models/user.rb:24:in `update_last_tracking_number_option1'
  Project Create (0.6ms)  INSERT INTO "projects" ("name", "description", "status", "project_type", "client_id", "user_id", "created_at", "updated_at", "tracking_number") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING "id"  [["name", "deede"], ["description", "sdsads"], ["status", "Active"], ["project_type", "3D Sculpture"], ["client_id", 2], ["user_id", 2], ["created_at", "2023-05-19 13:47:34.309552"], ["updated_at", "2023-05-19 13:47:34.309552"], ["tracking_number", nil]]
  ↳ app/models/user.rb:24:in `update_last_tracking_number_option1'
  TRANSACTION (0.6ms)  COMMIT
  ↳ app/models/user.rb:24:in `update_last_tracking_number_option1'
  TRANSACTION (0.1ms)  BEGIN
  ↳ app/controllers/projects_controller.rb:48:in `block in create'
  Project Update (0.3ms)  UPDATE "projects" SET "updated_at" = $1, "tracking_number" = $2 WHERE "projects"."id" = $3  [["updated_at", "2023-05-19 13:47:34.312597"], ["tracking_number", "IDENT23-01"], ["id", 16]]
  ↳ app/controllers/projects_controller.rb:48:in `block in create'
  TRANSACTION (0.2ms)  COMMIT
  ↳ app/controllers/projects_controller.rb:48:in `block in create'
Redirected to http://localhost:3000/projects/16
Completed 302 Found in 19ms (ActiveRecord: 3.2ms | Allocations: 9010)

内容的提问来源于stack exchange,提问作者Emmki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 21:46:59