model關聯的失敗異常

更新 發佈閱讀 6 分鐘

  在練習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是有存在的。 (如圖四)

raw-image
raw-image
raw-image
raw-image

  後來依照龍哥的為自己學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上。

raw-image
raw-image

解決方法:

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

2. 強制給實體掛上store_id:

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

u1=User.new(name:"美國")
(0.7ms) SELECT sqlite_version(*)

u1.save
TRANSACTION (0.1ms) begin transaction
User Create (1.0ms) INSERT INTO "users" ("name", "created_at", "updated_at") VALUES (?, ?, ?) [["name", "美國"], ["created_at", "2022-05-29 14:44:39.616534"], ["updated_at", "2022-05-29 14:44:39.616534"]]
TRANSACTION (1.2ms) commit transaction
=> true

s1=Store.new(title:"costco")

u1.store = s1
Store Load (0.3ms) SELECT "stores".* FROM "stores" WHERE "stores"."user_id" = ? LIMIT ? [["user_id", 1], ["LIMIT", 1]]
TRANSACTION (0.0ms) begin transaction
Store Create (0.9ms) INSERT INTO "stores" ("title", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["title", "costco"], ["user_id", 1], ["created_at", "2022-05-29 14:45:20.222725"], ["updated_at", "2022-05-29 14:45:20.222725"]]
TRANSACTION (1.1ms) commit transaction

接下來處理Product:
p1=Product.new(name:"衛生紙")

重點來了,先把store的id塞給product:
p1.store_id = s1.id
=> 1

打p1確認一下

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

(因為一直發布失敗,或是發布後程式碼消失,造成排版亂掉,所以就只好省略部分程式碼)





留言
avatar-img
留言分享你的想法!
avatar-img
Mike的沙龍
1會員
13內容數
Mike的沙龍的其他內容
2022/08/13
在 Rail 的 MVC 架構中,M 是負責驗證與邏輯、以及轉譯向資料庫溝通的角色; C 是負責資料的搬運,搬往 M 或 V; V 則是負責畫面的呈現、及使用者與資料的互動,並將請求送往C,接著得到 C 送回來的資料。 form_tag form_for form_with
2022/08/13
在 Rail 的 MVC 架構中,M 是負責驗證與邏輯、以及轉譯向資料庫溝通的角色; C 是負責資料的搬運,搬往 M 或 V; V 則是負責畫面的呈現、及使用者與資料的互動,並將請求送往C,接著得到 C 送回來的資料。 form_tag form_for form_with
2022/08/12
將 Rails 環境帶入 rake 裡,讓 rake 可以使用 Rails 的元素,像是 Model: 如果沒有導入環境給 rake ,rake 就找不到 User ,就沒辦法 new 了。 終端機輸入: 透過回圈,一個指令,產生多筆資料: 更複雜的:
2022/08/12
將 Rails 環境帶入 rake 裡,讓 rake 可以使用 Rails 的元素,像是 Model: 如果沒有導入環境給 rake ,rake 就找不到 User ,就沒辦法 new 了。 終端機輸入: 透過回圈,一個指令,產生多筆資料: 更複雜的:
2022/08/01
在介紹什麼是樂觀鎖、什麼是悲觀鎖之前,我們先來了解一下,這兩個鎖是應用在什麼地方? 資料庫 為了達成這件萬中選一的情況,就必須使用到「鎖」的概念。 悲觀鎖 從字面上來想,可以很清楚的知道,這個鎖是用悲觀來看待資料的寫入。基於對事件的不信任,所採取的行為。 樂觀鎖
2022/08/01
在介紹什麼是樂觀鎖、什麼是悲觀鎖之前,我們先來了解一下,這兩個鎖是應用在什麼地方? 資料庫 為了達成這件萬中選一的情況,就必須使用到「鎖」的概念。 悲觀鎖 從字面上來想,可以很清楚的知道,這個鎖是用悲觀來看待資料的寫入。基於對事件的不信任,所採取的行為。 樂觀鎖
看更多
你可能也想看
Thumbnail
題目敘述 題目會給我們一張Products資料表。裡面分別有product_id、new_price、change_date等欄位。其中(product_id, change_date)是這張資料表的複合主鍵Primary key。 所有商品預設都是10元。之後若有更新,則以新價格為主。 要求
Thumbnail
題目敘述 題目會給我們一張Products資料表。裡面分別有product_id、new_price、change_date等欄位。其中(product_id, change_date)是這張資料表的複合主鍵Primary key。 所有商品預設都是10元。之後若有更新,則以新價格為主。 要求
Thumbnail
題目會給我們兩張資料表。 第一張是Customer資料表,裡面分別有customer_id 、product_key 等欄位。其中product_key 是這張資料表的外鍵foreign key,關連到第二張Product資料表。 題目還特別提醒,這張資料表可能包含重複的data row
Thumbnail
題目會給我們兩張資料表。 第一張是Customer資料表,裡面分別有customer_id 、product_key 等欄位。其中product_key 是這張資料表的外鍵foreign key,關連到第二張Product資料表。 題目還特別提醒,這張資料表可能包含重複的data row
Thumbnail
題目敘述 題目會給我們兩張資料表,第一張是Sales,第二張是Product。 第一張是Sales表格,裡面分別有sale_id、 product_id、year、quantity、price等欄位。其中(sale_id、 product_id)做為複合主鍵Primary key
Thumbnail
題目敘述 題目會給我們兩張資料表,第一張是Sales,第二張是Product。 第一張是Sales表格,裡面分別有sale_id、 product_id、year、quantity、price等欄位。其中(sale_id、 product_id)做為複合主鍵Primary key
Thumbnail
有兩張資料表格,第一張是顧客資料表,第二張是訂單資料表。請找出所有顧客資料,不管這位顧客有沒有訂購過商品。請列出名字、姓氏、居住城市、訂購明細。注意:可能會有重複的資料點,因為一位顧客可以重複訂購同一件商品。最後依照顧客名字、訂購明細遞增排序。
Thumbnail
有兩張資料表格,第一張是顧客資料表,第二張是訂單資料表。請找出所有顧客資料,不管這位顧客有沒有訂購過商品。請列出名字、姓氏、居住城市、訂購明細。注意:可能會有重複的資料點,因為一位顧客可以重複訂購同一件商品。最後依照顧客名字、訂購明細遞增排序。
Thumbnail
有兩張資料表格,第一張是顧客資料,第二張是訂單資料。請找出名字叫Jill和Eva的客戶資料,並其對應的訂單日期、明細、金額,最後依照顧客號碼由小至大排序。
Thumbnail
有兩張資料表格,第一張是顧客資料,第二張是訂單資料。請找出名字叫Jill和Eva的客戶資料,並其對應的訂單日期、明細、金額,最後依照顧客號碼由小至大排序。
Thumbnail
商品沒有陳列,零銷售!   要陳列才能有銷售,可是若賣場不願意陳列你的商品,你的商品就沒有機會進入消費者的視線,又如何能夠創造銷售呢? 這是有可能發生的!有可能賣場人為疏忽,忘記陳列商品。當一項商品賣場進貨後,一週沒有銷售,就應該去關心下是否賣場的人員忘記幫忙陳列啦! 2. 商品下架召回!
Thumbnail
商品沒有陳列,零銷售!   要陳列才能有銷售,可是若賣場不願意陳列你的商品,你的商品就沒有機會進入消費者的視線,又如何能夠創造銷售呢? 這是有可能發生的!有可能賣場人為疏忽,忘記陳列商品。當一項商品賣場進貨後,一週沒有銷售,就應該去關心下是否賣場的人員忘記幫忙陳列啦! 2. 商品下架召回!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News