Rails: как ActiveRecord генерирует следующий первичный ключ - PullRequest
1 голос
/ 31 марта 2020

Я печатаю идентификатор записи после сохранения метода обратного вызова, как показано ниже. после вывода «id» я вызываю исключение.

def after_save_run
  puts "id is #{self.id}"
  raise "exception"
end

Приведенный выше метод генерирует вывод ниже для каждого вызова сохранения

id is 1
id is 2
id is 3

Из-за исключения в методе после сохранения no записи сохраняются в базе данных и, следовательно, моя таблица пуста, но тогда как acitverecord автоматически увеличивает первичный ключ? Как activerecord знает, каким был последний сгенерированный идентификатор, если в таблице нет записей?

1 Ответ

1 голос
/ 01 апреля 2020

Это потому, что внутренне ID не определяется Rails - он задается «последовательностью» в вашей RDBMS. Эта последовательность является текущим счетчиком, который увеличивается всякий раз, когда вы вытаскиваете из него новый номер - независимо от того, действительно ли вы зафиксировали этот номер в своей таблице.

Это означает, что попытка вставить новую строку будет увеличивать счетчик последовательности, и, поскольку вы вызываете исключение, эта строка не сохраняется. Но это не меняет того факта, что число было вычеркнуто из последовательности и не может быть возвращено в него.

Последовательности также по большей части являются таблицами c - вы можете использовать одну и ту же последовательность в разных таблицах, если хотите.

https://www.postgresql.org/docs/current/functions-sequence.html

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