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
相关产品推荐
相关产品推荐

