【问题标题】:How to create serial number for ruby on rails?如何为 ruby​​ on rails 创建序列号?
【发布时间】:2018-08-23 07:16:21
【问题描述】:

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

【问题讨论】:

  • 到目前为止你尝试了什么,你能显示代码吗?
  • 您需要在模型中实现自定义方法。您要在哪个型号中创建此序列号?提供更多细节
  • [Admission.transaction do cus = @admission.customer cus.inpatient_id = cus.inpatient_id || "I-%.6d" % cus.save end] 我想在 cus.inpatient_id 中添加序列号代码,喜欢 T-0001、T-0002、T-0003。如何创建?
  • 您在运行代码时是否遇到任何错误或意外结果?
  • 不是错误得到,而是' cus.inpatient_id = cus.inpatient_id || "I-%.6d" % cus.id' 生成喜欢 I-0005,5 是客户 ID。我想从 I-0001 开始创建。如果客户有 I-0001,但客户没有 nil。

标签: ruby-on-rails ruby web rubygems


【解决方案1】:

大多数 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

【讨论】:

    【解决方案2】:

    这里只是在范围内生成所需的格式化系列的示例:

    > (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
    

    【讨论】:

    • “您可以使用对象的 id 作为唯一编号” – 取决于您的数据库。尝试从 MongoDB 的 ObjectIds 生成一个数字序列 :-)
    • 它将数据插入到数据库中为 '["T-0000", "T-0001", "T-0002", "T-0003", "T-0004", "T-0005 "]',我想为一张票创建一行,例如,[id = 1,ticket_id = T-0000],[id = 2,ticket_id = T0002]。
    • @Stefan : OP 不想存储为 id (primary-key) ,而是想存储在字段中。
    • @GaganGami 是的,我明白这一点。您建议从对象的 id 生成数字,对吗?如果您使用的是 MongoDB,您的对象 ID 看起来像 5b7e9f88d32a6d888b789d61 - 很难从中生成数字序列。
    • @Stefan,哦,我明白了,通过指定 DB 更新了答案
    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    相关资源
    最近更新 更多