Ответ 1
Нет, это правильное поведение. Когда вы создаете объект через new
(как в вашем примере), Rails не сохраняет его в базе данных (только в памяти).
Если вы выполняете Message.create
или Message.save
как theIV, тогда будет заполнен id
.
Я немного запутался в поле auto-increment id в рельсах. У меня есть проект рельсов с простой схемой. Когда я проверяю 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
?
Нет, это правильное поведение. Когда вы создаете объект через new
(как в вашем примере), Rails не сохраняет его в базе данных (только в памяти).
Если вы выполняете Message.create
или Message.save
как theIV, тогда будет заполнен id
.
Насколько мне известно, поле id
назначается только на save
s, а не на new
s.
Как показано на рисунке,
n = Movie.new
n.save
=> true
означает, что он сохранен и ему будет присвоен идентификатор. В качестве альтернативы,
n = Movie.create!
автоматически сохраняет и сохраняет его в базе данных и присваивает ему идентификатор с одной строкой кода.