model 關聯的失敗異常

前言

在練習model的關聯時,User has one Store; Store has many Products; Product has many Stores,發現Store與Product之間的關聯有異常,因為Product.new後,無法把Product的實體指定給Store,但Store確實是有save,有確實存在的。


問題如下:

  1. p1 = Product.new(name:”衛生紙”) 接著執行 p1.stores = s1 卻出現 undefined method “each”的錯誤訊息。

  2. 反過來執行 s1.products = p1 也是出現 undefined method “each”的錯誤訊息。

  3. 我用 s1.products.build(name:”衛生紙”) 再用 s1.save去存,結果出現 Products is invalid 的錯誤訊息。

  4. 我用 s1.products << p1 結果出現 Validation failed: Store must exist的錯誤訊息,但從最上面 Store.all可以確定Store是有存在的。

發現問題:

後來依照龍哥的為自己學Ruby裡的Model關聯性單元中,依序照著老師建立model並於rails c裡執行指令,確認都正常Store與Product間都沒問題,所以確認不是windows的問題。

於是比對了我的跟龍哥的schema與migration後,發現了不一樣的地方(如圖schema與圖migration)。

所以可能就是因為我在建立Product model時用 store:references,產生了null:false,而老師是用store_id:integer,導致我product的store_id在nil的情況下,無法把Product.new的實體指定到store上。

https://images.vocus.cc/1a52c0de-b7e7-49c3-82b8-a759f5e1f977.png

https://images.vocus.cc/29278c25-2002-48b2-85fb-a2fda1fe025c.png

解決方法:

  1. 就是要讓Product沒有null:false的限制。

  2. 強制給實體掛上store_id:

我們先把User / Store / Product都先建立出實體,並先把User跟Store先存好。

1
2
3
4
u1=User.new(name:"美國")
u1.save
s1=Store.new(title:"costco")
u1.store = s1

接下來處理Product:

1
p1=Product.new(name:"衛生紙")

重點來了,先把store的id塞給product:

1
p1.store_id = s1.id

打p1確認一下

這時可以得知,p1已經有store_id了,所以上述問題皆沒問題。