我对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
时,生成的对象的id
为nil
。
>> a = Message.new
=> #<Message id: nil, text: nil, created_at: nil, updated_at: nil>
id
不应该回来填充吗?
答案 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不正确,则可能会出现此错误。