如何在 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-0001
、T-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-0001
、T-0002
...
注意:我们刚刚创建了一个序列,您需要告诉数据库改用这个序列。
检查:
我想通过序列号创建票号,例如。 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-0001
、T-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-0001
、T-0002
...
注意:我们刚刚创建了一个序列,您需要告诉数据库改用这个序列。
检查: