Rails_Model_關聯性:一對一

ck100pro
ck100pro
Published in
6 min readNov 20, 2019

Rails的Modle關聯性很重要,尤其是在有會員系統的網頁上,其中的多種關聯性必須要很清楚,避免在後面的Modle設計上不良,這篇先對一對一的關聯做做練習,順便做個筆記。

首先我們要新增一個rails專案,並建立2個Model來建立彼此的關聯性

User_Model
Store_Model

這邊我們建立User的Model欄位有name、email、tel,第二個為Store的Model欄位有title、tel、address、user_id:integer

這邊有一個欄位叫user_id:integer,這個欄位的用途是來對應到User Model的id欄位,這又稱呼為外部鍵(Foreign Key),基本上這個欄位可以隨便叫,但在rails的慣例裡通常都是「要被對應的Model加上_id」,這個欄位加上去不代表這2個表單就有關聯還需要在各自的Model裡面加上一些內容才能完成彼此間的關聯。

可以打開migrate確認一下有沒有打錯字

migrate確定好之後進入終端機輸入rails db:migrate來建立實體表單。

schema表單

接下來我們打開Model來設定彼此的關聯,加上belongs_to和has_one分別對應到相對應的model。

我們進入Rails專案裡,並啟動Rails console,我們在裡面建立一個叫做皮卡丘的使用者。

皮卡丘使用者

使用者建立好之後,我們在建立一間叫大聯盟的商店。

神奇寶貝大聯盟商店

接下來我們把store1指定給user1。

在這邊你可以看到user1、store1的id都是nil,這是因為我們還沒有進行save所以id都會是nil,所以我們接下來要進行save。

save後的訊息

接下來我們可以用Model來把資料撈出來看。

user的詳細資料
store的詳細資料

當我們把資料撈出來看,可以看到id都已經建立進去,重點是store的user_id也已經有id碼,而這個id碼就是對應到user的id碼。

以上這種方法是先將store和user先建立起來,再把store指定給user,接下來我們可以用user的角度來建立商店,一樣我們先建立一位新的user。

new一個新的使用者

由於has_one會建立一些方法,我們接下來用has_one的build_store來建立一個一個新的商店,build_store完之後要再用save方法來存入資料表。

如果覺得build_store完之後還要在save一次很麻煩,我們可以用create_store方法直接存入資料表,我們這邊在建立一個使用者來看一下。

我們這邊可以看到直接使用create_store會發生錯誤,這邊的問題是在於user4沒有先進行儲存,所以才出現這個問題,所以我們先將user4進行save,再接著使用create_store就ok了

以上都是has_one的一些用法,接下來我們來看belongs_to,belongs_to所產生的方法沒有像has_one這麼多,我們建立一位user和一間store,在一開始我們是將store賦予給user,我們可以這過程反過來把user賦予給store,一樣可以儲存資料表。

我們可以直接呼叫store或user的方法來查詢彼此的關聯,呼叫store1的user方法可以查到相關聯的資料,而呼叫user1的store方法可以查到對應的store名稱,而相對應的連結就是user_id這個欄位他會對應到user的id。

總結:

  1. 一對一比較好理解,記住方法和規則就不會亂掉
  2. has_one會幫你做出4種方法,以這邊文章的Model為例,User是has_one到Store,所以會產生以下4種方法,store、store=、build_store、create_store,其中create_store可以直接將資料寫進資料表內,但這個前提是user要先存入資料表內不然會出現錯誤。
  3. belongs_to只會有2個方法,以這邊文章的Model為例,Store是belongs_to到User,所以會產生以下2種方法,user、user=,這2種用法基本上和has_one一樣。

這篇就先到這邊,下一篇會說多對一~~~~

--

--