我想按序列号创建票号,例如。 T-0001,T-0002,T-0003, 用于Rails项目上的红宝石。怎么做?
Admission.transaction do
cus = @admission.customer
cus.inpatient_id = cus.inpatient_id || "I-%.6d" % cus.id
cus.save
end
答案 0 :(得分:3)
大多数rails服务器是多线程的。意味着许多请求将被并行处理。您可以想象有两个过程试图在同一时间创建新的序列号-重复的票证号! -不是我们确定的期望。
最好将创建ID的任务委托给数据库本身。因此,我们将告诉数据库以这种格式(T-0001
,T-0002
,...)创建ID,而不是使用默认的自动递增ID(1,2,3,4 ...)。这可以使用custom sequences来实现。我在这里假设使用postgres数据库,但对于mysql应该是相同的。
首先创建序列
CREATE SEQUENCE ticket_seq;
但是序列不允许使用字符串,因此我们将其转换为字符串并设置其格式:
SELECT 'T-'||to_char(nextval('ticket_seq'), 'FM0000');
这将返回类似T-0001
,T-0002
...
注意:我们刚刚创建了一个序列,您需要告诉数据库使用该序列。
答案 1 :(得分:0)
这只是示例,可以在范围内生成所需的格式化序列:
> (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's comment:
Admission.transaction do
cus = @admission.customer
cus.inpatient_id = cus.inpatient_id || "T-#{cus.id.to_s.rjust(4, "0")}"
cus.save
end