ruby-on-rails - 如何为 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
解决方案
大多数 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-0001
,T-0002
...
注意:我们刚刚创建了一个序列,你需要告诉数据库使用这个序列。
推荐阅读
- django - 对象创建根据基本模型字段分配代理类
- c - 使用 LD_PRELOAD 包装克隆系统调用
- java - 使用代码不断使索引 1 超出长度 1 错误的范围
- google-apps-script - 有没有办法使用 Google 应用程序脚本查看网站网络请求的名称?
- c++ - 比每种事件类型都有多个向量更好的系统
- pdf - 使用HTTrack只在某个子域下下载pdf(外网)
- javascript - Autodesk Forge - 用于从外部 SQL 数据库获取数据的扩展按钮
- java - Spring Boot AuthenticationManager 不会验证我的用户
- c++ - 文件中基于 16 个字符串的 stoi() 不起作用
- heroku - Heroku 上的 Adsense