2

ID が 1 ではなく 0 から自動インクリメントする Rails モデルを作成できますか? どのように?落とし穴はありますか?ここで確認しましたが、できないようです:

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

できないように見える場合、このクラスの最初のインスタンスに 0 の ID を手動で割り当てることができない、または割り当てる必要がない理由はありますか? その場合、Rails は次に作成されるインスタンスに ID 1 を自動的に割り当てますか?

4

3 に答える 3

5

なぜそれをする必要があるのですか?Railsモデルでは、オブジェクトIDはデータベースからの一意のIDを表し、0になることはありません(mysqlについて言えば、postgresのシーケンスとシリアルには例外があるかもしれません)。

于 2009-09-20T06:13:16.033 に答える
2

ActiveRecord は、アプリケーション ドメイン内で意味を持たない単一の主キー列が各テーブルにあるという原則に基づいて機能します。これが (部分的に)移行でid列を定義する必要がない理由です。create_table列名 (および型) は主に従来のスキーマに対応するために変更できますが、複数列の主キーを実装するのはまったく困難です。

ドメインの重要性をIDに帰し始めた時点で、慣習を破り始めているので、保持する別のフィールド/プロパティ/メンバー変数/列/持っているものを作成することを強くお勧めしますその情報。id はキーのままにしておきます。

params[:id] == '0'あなたが説明したユースケースでは、コントローラーが特殊なケースを識別して適切に処理し、 以外の方法で識別した「プロジェクト部分」に切り替えるべきではない理由はありませんid。おそらく各プロジェクトを0から開始したいので、次のようなものを追加して、ルートseqの代わりにそれを使用すると思います。そうすれば、paramsキーがより理にかなっています。idプロジェクトの現在の最高seq値を保持して、新しいパーツが作成されたときに割り当てる番号を認識します。削除と挿入(シーケンスの問題を想定)は完全にあなた次第です...

于 2009-09-20T09:54:56.510 に答える
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 の位置が重要であることに注意してください。

于 2009-09-20T08:58:37.513 に答える