Подтвердить что ты не робот

Изменение идентификаторов базы данных из консоли Rails?

У меня есть небольшая база данных и добавляются записи через страницу Rails. Я "уничтожил" одну из записей, и теперь моя последовательность идентификаторов пропускается одной. Например, теперь у меня теперь 42, а 44, а не на очевидное: 42, 43, 44.

Мне было интересно, есть ли способ редактировать идентификационный номер нового объекта через консоль. Я пробовал:

record.id = 43
record.save

и

record = record.new
record.attributes = { :id => 43 }

но оба не работали. Я довольно уверен, что для этого должен быть консольный метод, но я не могу найти много конкретного в Google, и я, вероятно, неправильно читал Rails API... Возможно, мне придется сделать это через прямой SQL в sqlite

Спасибо

4b9b3361

Ответ 1

Возможно, мне придется сделать это через прямой SQL в sqlite?

Да.

Весь смысл ActiveRecord заключается в том, что это абстрактные функции DB и просто возвращает коллекции данных. Вы не должны беспокоиться об идентификаторе записи, что-то специфическое для БД. С головы до ног я не могу придумать никаких причин ссылаться на идентификатор модели.

Если ваше приложение зависит от того, имеет ли он порядковый номер, вы должны добавить другое поле в модель, которая имеет это. Например, если у меня есть магазин с продуктами (модель продукта), и я даю идентификационный номер, который DB предоставляет другим поставщикам. Две недели спустя мой босс попросил меня иметь уникальный, но похожий идентификатор для двух вариантов продуктов: "45a" и "45b". Гайки. Для идентификации записи поле ID должно использоваться только для базы данных и ActiveRecord, а не для вас или ваших пользователей.

Существует небольшая вероятность того, что может быть неясный метод, который принудительно устанавливает идентификатор, если БД позволяет это, но он неясен по какой-либо причине. Не пытайтесь найти его:)

Все, что сказано, введите ruby script/dbconsole, чтобы быстро вывести интерфейс sqlite без ввода пароля.

Кроме того, если вы удалите базу данных sqlite, которая будет reset, счетчик и начнется с 0. С большой мощностью приходит большая ответственность.

ИЗМЕНИТЬ

Если я правильно помню, то об этом где-то писал Дэйв Томас. Возможно, здесь?

Ответ 2

Лучший способ сделать это - выполнить SQL напрямую и решить эту временную ошибку в последовательности.

Попробуйте получить доступ к консоли (ruby script/console) и введите:

>> sql = "update records set id=43 where id=44"
>> ActiveRecord::Base.connection.execute(sql)

Где 44 - это вновь созданный идентификатор объекта, а 43 - тот, который вы отсутствовали в своей таблице.

Удачи!

Ответ 3

Собственно, вы можете вручную установить идентификатор для новых объектов:

record = Record.new
record.id = 1234
record.save

Однако, что вы пытаетесь сделать, это обновить идентификатор существующего объекта. Когда вы устанавливаете record.id = 43, а затем вызываете save, происходит то, что ActiveRecord будет пытаться генерировать SQL следующим образом:

update records set id = 43 where id = 43

Обратите внимание, что идентификатор, который он ищет для обновления, совпадает с идентификатором, который вы пытаетесь изменить. Вот почему это не работает.

Итак, да, вам придется использовать SQL, чтобы изменить это. Независимо от того, является ли это хорошей идеей другой проблемой, но иногда это необходимо сделать.