如何为轨道上的红宝石创建序列号?



我想按序列号创建票号,例如。T-0001, T-0002, T-0003, 对于Ruby on Rails项目。怎么做?

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

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

我们最好将创建 id 的任务委托给数据库本身。因此,我们将告诉数据库以这种格式(T-0001T-0002、...(创建 id,而不是默认的自动增量 id(1,2,3,4...(。这可以使用自定义序列来实现。我在这里假设 postgres 数据库,但对于 mysql 应该是一样的。

第一个创建序列

CREATE SEQUENCE ticket_seq;

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

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

这将返回类似T-0001T-0002...

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

检查:https://stackoverflow.com/a/10736871/3507206

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

> (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- 主键始终序列化且唯一(

更新:根据OP的评论:

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

最新更新