代码之家  ›  专栏  ›  技术社区  ›  steven_noble

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

  •  1
  • steven_noble  · 技术社区  · 15 年前

    我可以创建一个Rails模型,其中ID从0自动递增,而不是从1递增吗?怎样有什么问题吗?我在这里查过了,看来我不能:

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

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

    3 回复  |  直到 15 年前
        1
  •  5
  •   Eimantas    15 年前

    你为什么要这么做?在Rails模型中,对象id表示来自数据库的唯一id,该id永远不能为0(我指的是mysql,在postgres中可能存在序列和序列的异常)。

        2
  •  2
  •   Mike Woodhouse    15 年前

    ActiveRecord的工作原理是,每个表都有一个在应用程序域中没有意义的主键列。这就是(部分)为什么你不必定义 id 在您的 create_table

    在您描述的用例中,您的控制器没有理由不识别特殊情况,其中 params[:id] == '0' 并适当地处理它,切换到“项目部分”,您以某种方式而不是通过 身份证件 seq 用它来代替 身份证件 在您的路由中,这样您的参数键就更有意义了。保持当前最高值 序号 值,以便在创建新零件时知道要指定的编号。删除和插入(假设顺序问题)完全由您决定。。。

        3
  •  0
  •   Omar Qureshi    15 年前

    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的位置很重要。