为Rails表单创建一个递增的数字生成器

时间:2015-08-06 22:16:46

标签: ruby forms postgresql ruby-on-rails-4

我看过论坛,通过教程学习并查看了Rails指南,但似乎无法找到我正在寻找的内容。

我正在尝试为我工作的公司创建一个安全应用程序,我正在创建报表。我希望报告编号为升序编号但不确定要搜索或执行此操作的内容。

我使用PostgreSQL作为dev和prod的数据库。

1 个答案:

答案 0 :(得分:2)

如果将id列设置为主键(通常情况下),则可以使用该列。它对每个报告都是唯一的,永远不会重复,并且每个新报告都会增加一个报告。

或者您可以为报告#创建一个列并使用:

CREATE TABLE tablename (
  colname SERIAL
);

这等于:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
  colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

这将允许您通过以下方式设置起始编号:

SELECT setval('colname', 42, false); 

false表示分配的第一个数字是42,而不是43.如果省略或设置为true,它将返回43作为序列中的第一个值。

Postgres中序列的一个重要方面是每次都会分发一个新的数字,即使该行由于事务失败而无法停留。所以你可能会在序列中缺少数字。

请务必阅读:http://www.postgresql.org/docs/9.3/static/functions-sequence.html

如果这是一个问题,您可能只想通过执行以下操作来完成Rails中的所有操作:

next_number = Report.select(:id).order('id DESC').limit(1).pluck(:id).first + 1

并对列具有唯一约束以确保没有重复的数字。

对于其他数据库,请参阅:http://www.w3schools.com/sql/sql_autoincrement.asp