Является ли мой вывод правильным для создания нового объекта из консоли? - PullRequest
2 голосов
/ 17 октября 2010

Я прохожу через Ruby on Rails Up and Running от O'Reilly и столкнулся с вопросом, к которому я не уверен, куда обратиться за помощью.

Я в той части книги, где я создаю новые объекты из консоли и затем сохраняю их в базу данных.Я уже создал базу данных (MySQL), запустил миграцию и, наконец, убедился, что rails создал схему базы данных (до этого момента также проходил остальную часть книги).

Чтобы создать запущенный объектследующие команды:

ruby script/console

photo = Photo.new

Вывод, который показала книга:

#<Photo:0x35301d8 @attributes={"filename"=>""}, @new_record=true>

Однако вывод, который я получил, был:

#<Photo id: nil, filename: nil>

Из чегоЯ понимаю, что когда новый объект создается таким образом, генерируется уникальный идентификатор для идентификации этого объекта, но оказывается, что в моем случае уникальный идентификатор не был создан.Я немного погуглил по этому вопросу, и его сложно найти, потому что это не само сообщение об ошибке;но я уверен, что что-то пошло не такПоэтому я подумал, что приду к сообществу stackoverflow за помощью.

Спасибо, Адам

Ответы [ 2 ]

3 голосов
/ 17 октября 2010

Идентификатор (базы данных) генерируется только после сохранения в базе данных.Метод new просто создает экземпляр объекта, а не сохраняет его.

Будьте осторожны, чтобы не спутать object_id (0x35301d8) объекта Ruby с идентификатором базы данных (обычно это последовательное целое число).Идентификатор базы данных - единственный, который вам действительно нужен при написании приложений на Rails.

Что касается разницы в выводе, я рискну предположить, что это разница в версиях Rails (ActiveRecord).

0 голосов
/ 17 октября 2010

Если вы говорите о части 0x35301d8: этот уникальный идентификатор всегда «генерируется» (на самом деле это адрес памяти объекта, поэтому сгенерированный не является правильным словом, но это не имеет значения). Однако ActiveRecord определяет свой собственный метод inspect, который дает немного более читаемый вывод и просто не показывает идентификатор.

Вы все равно можете запросить идентификатор, позвонив photo.object_id.

Причина, по которой идентификатор отображается в статье, возможно, заключается в том, что статья использует более старую версию rails, где ActiveRecord еще не определил эту версию inspect метода.

id: nil, отображаемый в вашей версии, относится к другому идентификатору. Это идентификатор базы данных, который есть у вашего объекта ActiveRecord, и он не будет сгенерирован, пока вы не сохраните свой объект в БД.

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