如何在 rails 上为 ruby 创建序列号?

How to create serial number for ruby on rails?

我想通过序列号创建票号,例如。 T-0001、T-0002、T-0003、 用于 rails 项目的 ruby。怎么做这个?

Admission.transaction do
  cus = @admission.customer
  cus.inpatient_id = cus.inpatient_id || "I-%.6d" % cus.id
  cus.save
end

这里只是在范围内生成所需格式化系列的示例:

> (0..5).map{|e| "T-#{e.to_s.rjust(4, "0")}"}
#=> ["T-0000", "T-0001", "T-0002", "T-0003", "T-0004", "T-0005"]

如果您使用 PG / MySQL,您可以使用对象的 id 作为唯一编号(ID- 主键始终是序列化且唯一的)

更新: 根据

Admission.transaction do 
  cus = @admission.customer 
  cus.inpatient_id = cus.inpatient_id || "T-#{cus.id.to_s.rjust(4, "0")}"
  cus.save 
end

大多数 rails 服务器是多线程的。这意味着许多请求将被并行处理。您可以想象两个进程试图在同一时间点创建一个新的序列号——重复的票号! - 不是我们所期望的那样。

我们最好将创建 ID 的任务委托给数据库本身。因此,我们将告诉数据库以这种格式(T-0001T-0002、...)创建 ID,而不是默认的自动递增 ID(1,2,3,4...)。这可以使用 custom sequences. I am assuming postgres database here, but should be same for mysql.

来实现

首先创建序列

CREATE SEQUENCE ticket_seq;

但是序列不允许使用字符串,所以我们将它们转换为字符串并格式化它们:

SELECT 'T-'||to_char(nextval('ticket_seq'), 'FM0000');

这将 return 值,例如 T-0001T-0002 ...

注意:我们刚刚创建了一个序列,您需要告诉数据库改用这个序列。

检查: