首页 > 解决方案 > 如何为 ruby​​ on rails 创建序列号?

问题描述

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

标签: ruby-on-railsrubywebrubygems

解决方案


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

最好将创建 id 的任务委托给数据库本身。因此,我们将告诉数据库以这种格式(T-0001, T-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


推荐阅读