сброс идентификатора первичного ключа в рельсах - PullRequest
3 голосов
/ 28 декабря 2010

У меня проблема с увеличением первичного ключа, когда я удаляю из таблицы и снова вставляю.Это проблематично, потому что у меня есть другие модели, связанные с очищенной таблицей.Например, если у меня есть Apple, которая принадлежит_Компьютеру, то, когда я очищаю таблицу «Компьютеры» и заново добавляю компьютер, ассоциации портятся, потому что у Apple теперь есть детские computer_id в его строках.Я хочу иметь возможность сбросить первичный ключ компьютера, чтобы при повторном добавлении компьютера связь оставалась нетронутой.Как мне делать это в рельсах?

Редактировать Мне очень жаль, что я не понял этого, но теперь я скажу вам, что я хочу сделать.Я хочу, чтобы пользователь был связан с машиной (компьютером).Компьютер имеет свой собственный идентификатор и может быть создан только администратором.В таблице компьютеров есть фиксированное количество компьютеров.

User
belongs_to :computer

Computer
has_many :users

Проблема, с которой я сталкиваюсь, заключается в том, что я предварительно загрузил компьютерную таблицу в seed.rb / некоторый rakefile.Когда я запускаю свое приложение, я хочу просто запустить файл, который сначала удаляет все, а затем предварительно загружает таблицу.Это позволит пользователю выбрать компьютер только из тех, которые указаны в таблице компьютеров.Я хочу иметь возможность запустить этот скрипт снова (скажем, в консоли heroku, не удаляя таблицу User) и по-прежнему получать один и тот же идентификатор для каждой машины (и, следовательно, для каждого пользователя).Я не понимаю, как мне это сделать.Пожалуйста, дайте мне знать, если я должен сделать это по-другому.

Ответы [ 3 ]

11 голосов
/ 28 декабря 2010

Во-первых, вы не должны этого делать!Если вы хотите изменить запись, просто обновите строки в вашей таблице.Не удаляйте и не вставляйте заново!Если вы все еще хотите это сделать, то вам следует удалить все связанные строки в других таблицах и вставить как компьютеры, так и яблоки.

Я не знаю, как Rails способ сброса первичного ключа с автоинкрементом, но если вы используете mysqlзатем вы можете выполнить пользовательский запрос:

ActiveRecord::Base.connection.execute('ALTER TABLE tablename AUTO_INCREMENT = 1')

он должен сбросить значение автоинкремента до следующего доступного числа.

РЕДАКТИРОВАТЬ:

Как загрузить данные с помощью id.Я не уверен, может ли загрузка с семенами сделать это, но наверняка использование приспособлений может помочь.Вам нужно подготовить файл computers.yml с данными:

First_computer:
  id: 1
  name: computer

Second_computer:
  id: 2
  name: dell

и т. Д.

Затем вы можете использовать его для загрузки в БД:

require 'active_record/fixtures'

Fixtures.create_fixtures("/path/to/directory/where/your/yml/file/is/", "computers")

Но он сбросит всю таблицу (все строки будут удалены и вставлены заново - но вы можете сохранить свои идентификаторы).

Опять же, я хочу предупредить вас, что загрузка данных таким способом - плохая идея.Светильники / семена должны использоваться только для заполнения вашей базы данных начальными (необходимыми для запуска вашего приложения) данными.

Почему вы хотите сбросить эту таблицу?

2 голосов
/ 28 декабря 2010

Это странный способ работы, но если вам нужно удалить и заменить ключи в связанной таблице, вы можете попробовать указать :dependent => :nullify, который сохраняет связанные строки и устанавливает внешний ключ в NULL при удалении:

class Computer
  has_many :apples, :dependent => :nullify
end

class Apple
  belongs_to :computer
end

c = Computer.find(some_id)
apples = c.apples
c.destroy # sets each foreign key in apples to NULL
new_c = Computer.create
new_c.apples = apples # sets each foreign key to new_c.id
1 голос
/ 28 декабря 2010

Вы не должны полагаться на сброс первичных ключей для поддержания отношений, это неправильный способ сделать это.Если вам придется удалить исходную таблицу, сохраняя при этом связь в будущем, используйте другой ключ для сопоставления, например, вы можете иметь поле кода в таблице компьютера и затем использовать его для построения ваших отношений.Вы указываете Foreign_key для ваших отношений .

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