Rails:调用Model.new时id字段为nil

时间:2010-04-11 22:07:37

标签: ruby-on-rails activerecord

我对rails中的自动增量id字段有点困惑。我有一个带有简单模式的rails项目。当我检查development.sqlite3时,我可以看到我的所有表都有一个带有自动增量的id字段。

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

但是当我在控制台中调用Message.new时,生成的对象的idnil

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

id不应该回来填充吗?

5 个答案:

答案 0 :(得分:24)

不,这是正确的行为。当您通过new创建对象时(如您的示例所示),Rails不会将其持久保存到数据库中(仅在内存中)。

如果您执行Message.create,或Message.save喜欢 theIV ,则会填充id

答案 1 :(得分:5)

就像无花果所说,

n = Movie.new
n.save
=> true

表示已保存并将获得ID。可替代地,

n = Movie.create!

自动保存并将其存储在数据库中,并为其提供一行代码。

答案 2 :(得分:4)

据我所知,id字段仅在save s上分配,而不是在new s上分配。

答案 3 :(得分:0)

以上所有答案均正确。要添加到它们中,在实例上调用#save的方法如果能够插入数据库,将返回true,如果不能成功,则返回false。使用::create方法将创建模型的新实例,并在其上调用#save

您还可以使用#save!::create!方法。不同之处在于,如果它们未成功插入数据库,则将引发错误(与返回布尔值相反)。

答案 4 :(得分:0)

在我的情况下,我用常量(6)调用Model.create(event_id),该常量不是事件的实际ID。没有错误,并且活动记录模型返回了其他属性,但id为nil。

经过几个小时的调试,我通过将值更改为现有Event.id的实际引用ID(如以前)来修复了我的错误。请注意,如果您对其他一些表具有SQL外部约束,但您使用的ID不正确,则可能会出现此错误。