關連:多對多
這裡舉的例子是第 16 天舉的例子,每家飲料店可以賣很多及不同的飲料。但是,實際情況是,以珍珠奶茶來講,很多飲料店都會賣,以嚴謹的角度來看,其實是多對多的關聯。所以,用一句話來講每家飲料店除了可以賣很多種飲料之外,每種飲料也可以在很多家飲料店販售。
這種狀況是很常見的,沒辦法單純的在兩邊的 Model 設定 has_many 或 belongs_to 就搞定,多對多的關連通常會需要一個第三方的資料表來存放這兩邊 Model 的資訊,也就是這個例子裡「飲料店菜單」的概念。
第一步,我們先建立 Model:
我們先建立一個專門存放 DrinkStore 跟 Drink 這兩邊資訊的 Model。
Model 名稱 DrinkStoreMenu。
使用 Rails 的 Model 產生器來產生 DrinkStoreMenu,請在終端機輸入:rails g Model DrinkStoreMenu drink_store:references drink:references
最後別忘記執行 rails db:migrate
補充說明,在產生關聯時,可以使用 drink_store:references
or drink_store_id:integer
兩種寫法,但 references 的寫法會多做幾件事:
rails db:migrate
# 檔案:app/models/drink_store_menu.rb
class DrinkStoreMenu < ApplicationRecord
belongs_to :drink_store
belongs_to :drink
end
因為使用 references 的寫法,所以自動有幫你補上這兩行 belongs_to 方法,但如果沒有也沒關係,自己手動輸入即可。
# 檔案:app/models/drink_store.rb
class DrinkStore < ApplicationRecord
belongs_to :user
has_many :drink_store_menus
has_many :drinks, through: :drink_store_menus
end
# 檔案:app/models/drink.rb
class Drink < ApplicationRecord
has_many :drink_store_menus
has_many :drink_stores, through: :drink_store_menus
end