我的输出是否正确用于从控制台创建新对象?

时间:2010-10-16 23:18:53

标签: ruby-on-rails

我正在通过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社区寻求帮助。

谢谢, 亚当

2 个答案:

答案 0 :(得分:3)

(数据库)ID仅在保存到数据库后生成。 new方法只是实例化对象,不保存它。

注意不要将Ruby对象的object_id0x35301d8)误认为数据库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,在将对象保存到数据库之前不会生成它。