我正在通过O'Reilly进行Ruby on Rails Up and Running并遇到一个问题,我不知道该去哪里寻求帮助。
我正在本书的那一部分,我从控制台创建新对象,然后将它们保存到数据库中。我已经创建了数据库(MySQL),运行迁移并最终验证了rails创建了数据库模式(到目前为止还完成了本书的其余部分)。
要创建对象,我运行了以下命令:
ruby script/console
photo = Photo.new
本书显示的输出是:
#<Photo:0x35301d8 @attributes={"filename"=>""}, @new_record=true>
然而,我得到的输出是:
#<Photo id: nil, filename: nil>
据我所知,当以这种方式创建新对象时,会生成一个唯一ID来标识该对象,但在我的情况下,似乎没有生成唯一ID。我已经完成了相当多的谷歌搜索,搜索是一件困难的事情,因为它不是一个错误信息本身;但我很确定出现了问题。所以我想我会来stackoverflow社区寻求帮助。
谢谢, 亚当
答案 0 :(得分:3)
(数据库)ID仅在保存到数据库后生成。 new
方法只是实例化对象,不保存它。
注意不要将Ruby对象的object_id
(0x35301d8
)误认为数据库ID(通常是顺序整数)。在编写Rails应用程序时,数据库ID是您真正关心的唯一ID。
至于输出的差异,我会猜测它是Rails(ActiveRecord)版本的差异。
答案 1 :(得分:0)
如果你在谈论0x35301d8
部分:那个唯一的id总是“生成”(实际上它是对象的内存地址,因此生成的不是正确的单词,但这无关紧要)。但是,ActiveRecord定义了它自己的inspect
方法,它提供了更多可读输出,并且根本不显示id。
您仍然可以通过调用photo.object_id
来查询ID。
文章中显示id的原因可能是文章使用较旧版本的rails,其中ActiveRecord尚未定义此版本的inspect
方法。
您的版本中显示的id: nil
是一个不同的ID。这是您的ActiveRecord对象具有的数据库ID,在将对象保存到数据库之前不会生成它。