как получить следующий идентификатор в таблице в Rails - PullRequest
1 голос
/ 10 февраля 2010

У меня есть таблица со следующими столбцами

id   store_id   store_name  

id и store_id всегда будут одинаковыми. Так как я новичок в рельсах ... Я создал его по ошибке. Но я не могу позволить себе вернуться и изменить вещи сейчас, так как я использую store_id во многих местах.

Выпуск 1: Я делаю экран администратора для этой таблицы. Когда я пытаюсь вставить запись, даже если id вставляется (rails автоматически получает следующую), NULL вставляется в store_id.

Есть ли способы, которыми я могу иметь тот же номер в store_id, что и в id при вставке записи с использованием метода create. Есть ли что-то, что можно поместить в модель, чтобы она всегда выполнялась перед созданием записи. и там я могу иметь доступ к следующему Id, который должен быть вставлен?

Выпуск 2: Так как я делаю экраны администратора для этой таблицы сейчас ... раньше я просто вставлял данные в эту таблицу вручную. Я вставил 5 записей вручную, поэтому id и store_id 1..5 уже существуют. Теперь, когда я пытаюсь вставить запись с экрана администратора, он говорит, что дубликат ключа нарушает ограничение. Может быть, он пытается вставить идентификатор 1, так как это первый раз, когда я вставляю запись в эту таблицу с помощью rails?

Ответы [ 3 ]

2 голосов
/ 10 февраля 2010

Проблема 1 : пока не удастся удалить столбец store_id, переопределите метод получения в модели для совместимости.

def store_id
  id
end

Что касается Выпуск 2 : убедитесь, что ваш код создания не устанавливает id вручную. Следующая запись должна быть вставлена ​​ с идентификатором 6, если ваш объект не имеет идентификатора. Попробуйте с script/console.

1 голос
/ 11 февраля 2010

Вы можете установить собственный первичный ключ для моделей ActiveRecord:

class Store < ActiveRecord::Base
  set_primary_key :store_id
end

Затем вы можете создать новую миграцию, которая удаляет столбец «id» и обновляет столбец «store_id» в качестве первичного ключа.

1 голос
/ 10 февраля 2010

Я думаю, вы должны просто изменить свой код, чтобы использовать только идентификатор. Компетентный редактор сможет сообщить вам, где вы использовали идентификатор магазина в вашем проекте, и ваши тесты помогут, если вы введете ошибку регрессии.

В противном случае вы можете использовать триггер базы данных. Или установите обратный вызов для модели, чтобы установить store_id из вновь созданного значения идентификатора (посмотрите на обратный вызов after_create ). Опять же, оба эти подхода являются хакерами, чтобы легко исправить ошибку в вашей системе.

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