Могу ли я создать модель Rails, в которой идентификатор автоматически увеличивается от 0, а не от 1? - PullRequest
1 голос
/ 20 сентября 2009

Можно ли создать модель Rails, в которой идентификатор автоматически увеличивается с 0, а не с 1? Как? Есть ли какие-нибудь ошибки? Я проверил здесь, и, кажется, я не могу:

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

Если, как мне кажется, я не могу, есть ли причина, по которой я не могу или не должен просто присваивать идентификатор 0 первому экземпляру этого класса вручную? Если я это сделаю, Rails автоматически назначит идентификатор 1 следующему созданному экземпляру?

Ответы [ 3 ]

5 голосов
/ 20 сентября 2009

Зачем вам это нужно? В модели Rails идентификатор объекта представляет уникальный идентификатор из базы данных, который никогда не может быть 0 (я говорю о mysql, возможно, есть исключения с последовательностями и сериалами в postgres).

2 голосов
/ 20 сентября 2009

ActiveRecord работает по принципу, что каждая таблица имеет один столбец первичного ключа, который не имеет значения в домене приложения. Вот почему (частично) вам не нужно определять столбец id в ваших create_table миграциях. Имя столбца (и его тип) можно изменить, в основном, для адаптации к устаревшим схемам, а первичные ключи с несколькими столбцами трудно реализовать вообще.

В тот момент, когда вы начинаете приписывать значение идентификатора домена идентификатору, вы начинаете нарушать соглашение, и я настоятельно рекомендую создать другое поле / свойство / переменная-член / столбец / what-have- Вы держите эту информацию. Оставьте идентификатор, чтобы он был ключом.

В описываемом вами сценарии использования нет причины, по которой ваш контроллер не должен определять особый случай, где params[:id] == '0', и правильно с ним обращаться, переключаясь на «часть проекта», которую вы идентифицируете не так, как другие. на id. Поскольку вы, вероятно, хотите, чтобы каждый проект начинался с 0, я думаю, что вы добавите что-то вроде seq и будете использовать это вместо id в своих маршрутах, чтобы ваши ключи params имели больше смысла. Сохраняйте текущее наибольшее значение seq в проекте, чтобы он знал, какой номер назначить при создании новой детали. Удаление и вставка (при условии, что последовательность имеет значение) полностью зависит от вас ...

0 голосов
/ 20 сентября 2009

Для 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 важна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...