iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0
Software Development

SQL rookie 之天天魯一下系列 第 8

Day 8 - 為Model、Database 加上關聯(3)

  • 分享至 

  • xImage
  •  

哈囉,大家好!

經過前兩篇的研究,我們大概能得知在Rails 內,除了Model 要建立關聯,資料表也有關聯要建立,而ActiveRecord 的關聯方法(has_one、has_many、belongs_to、HaBTM 不僅能令關聯資料表更容易,且提供的方法也讓我們能更輕易地使用query methods

而今天的任務是將Model 和資料表都加上關聯,才能讓我們後續的query methods 增加可看性(自己說),或應該說比較符合真實情境吧!此外也想新增一個Model,並使用through 的方式來增加關聯:

讓我們一起試試看吧!

首先目前的關聯表是這樣的:
魯魯專案的Model 關聯圖_ver1

但因許多Podcast 都會有來賓,因此我想新增一個Guest Model 及資料表,可兩資料表的欄位幾乎一樣:
hosts and guests table

那我是不是能再抽一層資料表記錄共通的欄位,並再關聯hosts 和guests 資料表呢?

修正後的假想圖假想圖1:
魯魯專案的Model 關聯圖_ver2

接著我們就來修改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
ER 關聯箭頭示意表


上一篇
Day 7 - 為Model、Database 加上關聯(2)
下一篇
Day 9 - 插話:利用SampleDB seeding 資料(1)
系列文
SQL rookie 之天天魯一下30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言