我可以创建一个Rails模型,其中ID自动从0开始递增,而不是1吗?

时间:2009-09-20 06:11:16

标签: ruby-on-rails ruby model auto-increment

我可以创建一个Rails模型,其中ID自动从0开始递增,而不是1吗?怎么样?有没有陷阱?我在这里查了一下,似乎我不能:

http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#M001911

如果看起来,我不能,是否有理由不能或不应该只为这个类的第一个实例手动分配0的ID?如果我这样做,Rails会自动将ID 1分配给下一个创建的实例吗?

3 个答案:

答案 0 :(得分:5)

你为什么要这样做?在Rails模型中,对象id表示来自数据库的唯一id,它永远不能为0(我代表mysql,也许在postgres中有序列和连续出现的例外)。

答案 1 :(得分:2)

ActiveRecord的工作原理是每个表都有一个在应用程序域中没有意义的主键列。这(部分)是您不必在id迁移中定义create_table列的原因。列名(和类型)可以更改,主要是为了适应遗留模式,而且多列主键很难实现。

在您开始将域重要性归因于id时,您开始违反惯例,我强烈建议您创建另一个字段/ property / member-variable / column / what-have-你掌握这些信息。将id留作密钥。

在您描述的用例中,您的控制器没有理由不识别params[:id] == '0'的特殊情况并正确处理它,切换到“项目部分”,您以某种方式识别除id之外。由于您可能希望每个项目从0开始,我猜您会添加类似seq的内容并在路由中使用而不是id,这样您的params键就更有意义了。保持项目中当前最高的seq值,以便知道在创建新零件时要分配的编号。删除和插入(假设序列事项)完全取决于你......

答案 2 :(得分:0)

对于postgres,你可能想看看手动创建表格,例如

class MigrationName < ActiveRecord::Migration
  def self.up
    execute <<EOF

create sequence foos_id_seq start 0 increment 1 no cycle;
create table foos (
  id       integer not null default nextval('foos_id_seq'),
  ...
  primary key(id)
);
EOF
  end

  def self.down
    execute <<EOF
drop table foos;
drop sequence foos_id_seq;
EOF
  end
end

注意,EOF的位置很重要。