В Ruby on Rails, как создать запись с ID 3, когда она была уничтожена ранее? - PullRequest
3 голосов
/ 25 августа 2010

Я пробую экспериментальный проект Rails и уничтожил запись 3 (ID == 3), так что теперь есть записи 1, 2, 4 и 5.

Есть ли способ заполнить эту таблицуID записи от 1 до 5?(это использует mysql)

Я могу использовать

if Item.exists?(i)
  item = Item.find(i)
else
  item = Item.new
end

# set some values
item.name = "haha" + i
item.save

Item.new() для создания новых записей с новыми идентификаторами записей автоинкремента (в данном случае 6), но как насчетбыли удалены ранее?

Ответы [ 3 ]

8 голосов
/ 25 августа 2010

Вы можете установить идентификатор с помощью:

item = Item.new
item.id = i

Вы не можете передать :id => i в Item.new, потому что id является специальным атрибутом и автоматически защищен от массового назначения.

Вы также можете указать MySQL начать отсчет с 1, что автоматически заполнит все пропущенные идентификаторы:

Item.connection.execute("ALTER TABLE items AUTO_INCREMENT = 1")

(На самом деле, документы MySQL говорят, что это сбросит его на MAX(id) + 1, поэтому в этом случае он не будет использовать 3).

2 голосов
/ 25 августа 2010

MySQL не сделает это за вас, как вы, вероятно, знаете. При создании каждого отдельного элемента вы можете вернуться и посмотреть, есть ли какие-либо неиспользуемые идентификационные номера, и использовать их вместо этого. (Могу поспорить, что вы можете установить id явно, хотя я не пробовал.) Есть две причины, почему я бы не рекомендовал это:

  • Это значительно замедлит создание записей, когда вы получите большое количество записей.
  • Идентификатор предмета, как правило, предназначен для ссылки на него навсегда. Особенно, если вы планируете использовать идентификатор в URL-адресах, вам не следует повторно использовать номер идентификатора, если он когда-либо использовался ранее, для обеспечения согласованности данных. У удаленного элемента должны быть удалены все следы.

То есть, если вы говорите об использовании неиспользуемых идентификационных номеров при создании каждого предмета, как только вы доберетесь до производства. Если вы говорите о единовременной сделке, так как отсутствие пункта № 3 вас беспокоит ... ваше время лучше потратить на работу над чем-то другим.

1 голос
/ 25 августа 2010

Вы можете сделать это, как сказал @wuputah.И более того, обычно мы не должны удалять записи из таблицы, если только это не является основной таблицей (так как это может повлиять на другие отношения таблицы).Вместо этого мы можем сделать неактивные записи (скажем, имея столбец таблицы с именем active)

И сделать вещи проще, вы можете использовать плагин, как act_as_paranoid для достижения этого http://github.com/technoweenie/acts_as_paranoid

cheers

Sameera

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