在一個 Rails 專案中,你一定會有很多的 Model,這些 Model 之間也許會有一些關聯性,那為什麼 Model 之間要有關聯呢?這些關聯使我們程式碼寫起來更簡單,也簡化了常見的操作。
在 Rails 中 Model 主要分成三種關聯:
接下來,用一個簡單的商店系統來說明這些關聯性:
Model 也會提供一些關聯的方法,如 has_one、has_many 或 belongs_to ,我們將這些方法搭配 Rails 的資料表慣例設定主鍵(Primary Key)及外部鍵(Foreign Key),使這些資料表串在一起。
先從簡的的一對一關聯開始,每個擁有者 (Owner) 可以開一間店 (Store),行きましょう!
我們先簡單的做兩個 Model :
Owner 的 Model:
$ rails g model Owner name tel:integer
Store 的 Model,並讓它屬於 Owner :
# Store
$ rails g model Store title address owner:references
或
$ rails g model Store title address owner:belongs_to
不管是 references 或 belongs_to 這兩種效果都是一樣的。rails db:migrate 後,進到 schema.rb 來看看:
這邊 Owner 其實沒什麼特別的,要注意 Store 裡面的 owner_id ,這個欄位的型態是數字,主要的用途是用來對應到 Owner Model 的 id 欄位,又稱它叫外部鍵(Foreign Key)。
接著我們到 Model 看看:

你會發現 Store 裡面有 belongs_to :owner ,但 Owner 卻什麼東西都沒有。
所以我們在 Owner 加上 has_one :store :
class User < ApplicationRecord
  has_one :store
end
這樣我們就將這兩個 Model 的關聯建立起來了:
此時會自動產生以下的方法:
這些方法你可以在 cotroller 使用,也可以在 rails console 裡面用。
rails console 裡:我們進到 rails console ,首先用 new 方法建一個 owner 以及 一個 Store :
>> owner1 = Owner.new(name: "春春")
=> #<Owner id: nil, name: "春春", tel: nil, created_at: nil, updated_at: nil> 
>> store1 = Store.new(title: "超夯麵包店",address: "台北")
=> #<Store id: nil, title: "超夯麵包店", address: "台北", owner_id: nil, created_at: nil, updated_at: nil> 
把 store1 指定給 owner1:
>> owner1.store = store1
接著 save :
>> owner1.save

這兩筆資料會被存進各自的資料表內,而且 store1 的owner_id 欄位會設定成 owner1 的 id。
當我們去查 store1 時,你也會發現 owner_id: 1 :
這時候我們就可以透過 store1 去找到他的 owner 是誰了:
除了剛剛上面分開建立 owner1 和 store1 之外,我們也可以用 owner 的角度去建立 store ,所以這邊我們用 build_store 跟 create_store 去開店:
>> owner2 = Owner.create(name: "阿肥")
>> owner2.create_store(title:"貓貓集散地", address:"衡陽路")
這樣就建好一間店了:
至於 build_store ,因為他的作法跟 create_store 相似,只差了一個 save,這邊就不多做贅述了。
參考資料: