Как получить ActiveRecord для отображения следующего идентификатора (последний + 1) в Ruby on Rails? - PullRequest
40 голосов
/ 03 мая 2010

Существует ли компактный способ с ActiveRecord запрашивать, какой идентификатор он будет использовать следующим, если объект будет сохранен в базе данных? В SQL такой запрос будет выглядеть примерно так:

SELECT max(id) + 1 FROM some_table;

Ответы [ 13 ]

0 голосов
/ 04 июля 2019

Я пришел к этому такому вопросу, потому что я хотел иметь возможность предсказать идентификатор модели, созданной в моем наборе тестов (идентификатор был затем использован REST-запросом к внешней службе, и мне нужно было предсказать точное значение для макета запрос).

Я обнаружил, что Model.maximum(:id).next, хотя и элегантно, не работает в среде тестирования рельсов с фиксациями транзакций, поскольку обычно в БД нет записей, поэтому он просто вернет nil.

Транзакционные фиксаторы делают проблему еще более сложной, поскольку поле автоинкремента увеличивается, даже когда в БД нет записей. Кроме того, использование ALTER TABLE ***your_table_name*** AUTO_INCREMENT = 100 прерывает транзакцию, в которой находятся ваши тесты, поскольку для нее требуется собственная транзакция.

Я решил создать новый объект и добавить 1 к его идентификатору:

let!(:my_model_next_id) { FactoryBot.create(:my_model).id + 1 }

Хотя он несколько хакерский (и немного неэффективный для вашей БД, поскольку вы создаете дополнительный объект для его идентификатора), он не делает ничего глупого для транзакции и надежно работает в тестовой среде без записей (если только ваш тесты выполняются параллельно с доступом к одной и той же базе данных ... в этом случае: условия гонки ... может быть?).

0 голосов
/ 05 августа 2018

Вы никогда не должны предполагать, каким будет следующий идентификатор в последовательности. Если у вас более 1 пользователя, вы рискуете использовать идентификатор к моменту создания нового объекта.

Вместо этого безопасным подходом будет создание нового объекта и его обновление. 2 попадания в вашу базу данных, но с абсолютным идентификатором объекта, с которым вы работаете.

Этот метод берет догадку из уравнения.

0 голосов
/ 27 августа 2017

Не поймите намерения, но вы можете подумать об использовании GUID

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