哈囉,大家好!
經過前兩篇的研究,我們大概能得知在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