我可以创建一个Rails模型,其中ID自动从0开始递增,而不是1吗?怎么样?有没有陷阱?我在这里查了一下,似乎我不能:
http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#M001911
如果看起来,我不能,是否有理由不能或不应该只为这个类的第一个实例手动分配0的ID?如果我这样做,Rails会自动将ID 1分配给下一个创建的实例吗?
答案 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的位置很重要。