Изменить идентификаторы базы данных из консоли Rails? - PullRequest
16 голосов
/ 13 января 2009

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

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

record.id = 43
record.save

и

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

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

Спасибо

Ответы [ 3 ]

39 голосов
/ 22 июля 2009

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

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

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

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

Удачи!

23 голосов
/ 14 января 2009

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

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

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

update records set id = 43 where id = 43

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

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

4 голосов
/ 13 января 2009

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

Да.

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

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

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

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

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

EDIT

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

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