如何为Rails创建红宝石的序列号?

时间:2018-08-23 07:16:22

标签: ruby-on-rails ruby web rubygems

我想按序列号创建票号,例如。 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

2 个答案:

答案 0 :(得分:3)

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

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

首先创建序列

CREATE SEQUENCE ticket_seq;

但是序列不允许使用字符串,因此我们将其转换为字符串并设置其格式:

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

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

的值。

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

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

答案 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