哈囉,大家好!
經過前兩篇的研究,我們大概能得知在Rails 內,除了Model 要建立關聯,資料表也有關聯要建立,而ActiveRecord 的關聯方法(has_one、has_many、belongs_to、HaBTM 不僅能令關聯資料表更容易,且提供的方法也讓我們能更輕易地使用query methods
而今天的任務是將Model 和資料表都加上關聯,才能讓我們後續的query methods 增加可看性(自己說),或應該說比較符合真實情境吧!此外也想新增一個Model,並使用through 的方式來增加關聯:
讓我們一起試試看吧!
首先目前的關聯表是這樣的:
但因許多Podcast 都會有來賓,因此我想新增一個Guest Model 及資料表,可兩資料表的欄位幾乎一樣:
那我是不是能再抽一層資料表記錄共通的欄位,並再關聯hosts 和guests 資料表呢?
修正後的假想圖假想圖1:
接著我們就來修改Model 的關聯性和migration 吧!
❯ rails g model AnchorPerson nickname:string age:integer background:text podcast:references episode:references host:references guest:references
# rails db:migrate 後檢查Model AnchorPerson:
belongs_to :podcast
belongs_to :episode
belongs_to :host
belongs_to :guest
# ---------------------
# adjustment for Model Podcast
has_many :episodes
has_many :hosts, through: :anchor_persons
has_many :guests, through: :anchor_persons
# migration for table podcasts
def change
remove_column :podcasts, :host
end
# ---------------------
# adjustment for Model Episodes
belongs_to :podcast
has_many :hosts, through: :anchor_persons
has_many :guests, through: :anchor_persons
# migration for table episodes:
def change
remove_columns :episodes, :host, :guest
add_reference :episodes, :anchor_persons
end
# ---------------------
# adjustment for Model Host
belongs_to :episode
belongs_to :podcast
# migration for table hosts:
def change
remove_columns :hosts, :nickname, :age, :background
end
# ---------------------
# adjustment for Model Guest
belongs_to :episode
都修改好了之後,直接進console 確認關聯吧!
但要怎麼確認比較快呢?
補充:
要想關聯已經夠複雜了,關聯符號代表的意義也是很講究的呢...... 崩潰 XD