Rails: поле id равно nil при вызове Model.new - PullRequest
15 голосов
/ 12 апреля 2010

Я немного запутался в поле идентификатора автоинкремента в рельсах. У меня есть проект рельсов с простой схемой. Когда я проверяю development.sqlite3, я вижу, что во всех моих таблицах есть поле id с автоматическим приращением.

CREATE TABLE "messages" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "text" text, "created_at" datetime, "updated_at" datetime);

Но когда я вызываю Message.new в консоли, результирующий объект имеет id nil.

>> a = Message.new
=> #<Message id: nil, text: nil, created_at: nil, updated_at: nil>

Разве id не должен вернуться в населенный пункт?

Ответы [ 4 ]

24 голосов
/ 12 апреля 2010

Нет, это правильное поведение. Когда вы создаете объект с помощью new (как в вашем примере), Rails не сохраняет его в базе данных (только в памяти).

Если вы сделаете Message.create или Message.save, как сказал theIV , то будет заполнено id.

5 голосов
/ 14 июня 2011

Как сказал рис,

n = Movie.new
n.save
=> true

означает, что оно сохранено и ему будет присвоен идентификатор. С другой стороны,

n = Movie.create!

автоматически сохраняет и сохраняет его в базе данных и присваивает ему идентификатор с одной строкой кода.

4 голосов
/ 12 апреля 2010

Насколько я знаю, поле id присваивается только на save с, а не на new с.

0 голосов
/ 06 октября 2018

Все ответы выше верны. Чтобы добавить к ним, вызов метода #save для экземпляра вернет true, если он был в состоянии вставить в базу данных, и false, если он не был успешным. Использование метода ::create создаст новый экземпляр вашей модели и вызовет #save для нее.

Вы также можете использовать методы #save! или ::create!. Разница в том, что они вызовут ошибку (в отличие от возврата логического значения), если они не были успешно вставлены в базу данных.

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