让我们逐步解构一下,从错误信息开始。
无法找到ID为4的项目,以用于ID为空的发票
初看起来,可能会想到没有ID为4的项目。确保像这样的简单事情不是问题是一个好的合理性检查。在这种情况下,我们已经找到了正确的项目,所以可以继续。
一开始让我感到奇怪的是在ID=
后面缺少一个数字。原来这提示了问题所在。
让我们来看一下一些控制台输出。我将使用猫对象,仅仅因为它们很棒。
我们想做的第一件事是获取一个猫:
Cat.first
=> Cat Load (0.2ms) SELECT "cats".* FROM "cats" LIMIT 1
=> #<Cat id: 2, age: 6, birthdate: "2013-06-08", color: "brown", name: "Aaron", gender: "m", created_at: "2013-06-08 21:44:22", updated_at: "2013-06-08 21:44:22", user_id: 1>
在我们拥有这只猫之后,让我们将其复制。
Cat.first.dup
Cat Load (0.3ms) SELECT "cats".* FROM "cats" LIMIT 1
=> #<Cat age: 6, birthdate: "2013-06-08", color: "brown", name: "Aaron", gender: "m", created_at: nil, updated_at: nil, user_id: 1>
我们注意到这个重复的猫有什么特点呢?首先,
created_at
和
updated_at
都是
nil
。这通常意味着对象尚未保存到数据库中。如果我们去查找
Cat
的
ID
,我们会发现甚至没有列来存储它!让我们尝试保存这个新对象。
Cat.first.dup.save
Cat Load (0.3ms) SELECT "cats".* FROM "cats" ORDER BY "cats"."id" DESC LIMIT 1
(0.1ms) begin transaction
SQL (0.7ms) INSERT INTO "cats" ("age", "birthdate", "color", "created_at", "gender", "name", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?, ?, ?, ?) [["age", 6], ["birthdate", Sat, 08 Jun 2013], ["color", "brown"], ["created_at", Sun, 09 Jun 2013 18:10:47 UTC +00:00], ["gender", "m"], ["name", "Aaron"], ["updated_at", Sun, 09 Jun 2013 18:10:47 UTC +00:00], ["user_id", 1]]
(0.7ms) commit transaction
=> true
现在,如果我们调用
Cat.last
,它将返回此对象。
Cat.last
Cat Load (0.3ms) SELECT "cats".* FROM "cats" ORDER BY "cats"."id" DESC LIMIT 1
=> #<Cat id: 11, age: 6, birthdate: "2013-06-08", color: "brown", name: "Aaron", gender: "m", created_at: "2013-06-09 18:10:47", updated_at: "2013-06-09 18:10:47", user_id: 1>
你的问题在于,虽然你复制了
Invoice
,但没有将其保存到数据库中。
Couldn't find Item with ID=4 for Invoice with ID=
证实了这一点,因为它告诉我们复制的
Invoice
没有
ID
,这只有在它没有被保存时才会出现。
祝好!