iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 10
0
自我挑戰組

rails 學習紀錄系列 第 10

[Day10] Model 關聯(上)

  • 分享至 

  • xImage
  •  

Model 關連性
關連:一對一
關連:一對多
關連:多對多


在了解model關聯之前
1.關聯關係,兩端都要寫好。
2.model的名字是單數,controller是複數。
3.blong_to後面是單數小寫。has_many後面是複數。
4.Model 所提供的方法是讓Model之間建立連結,不是資料表之間。
(第2點和第3點是Rails 的慣例,在 Rails 中我們會盡量遵守「慣例優於設定」(CoC, Convention over Configuration)的原則,順著預設的慣例做,可以省下不少麻煩。)

資料表關聯設計
ActiveRecord可以用Associations來定義資料表之間的關聯性,這是最被大家眼睛一亮ORM功能。
關聯式資料庫的特性,那就是透過primary key和foreign keys將資料表互相關連起來。

  • Primary Key主鍵是一張資料表可以用來唯一識別的欄位,而Foreign Key外部鍵則是用來指向別張資料表的Primary Key,如此便可以產生資料表之間的關聯關係。
  • Primary Key這個欄位在Rails中,照慣例叫做id,型別是整數且遞增。而Foreign Key欄位照慣例會叫做{model_name}_id,型別是整數。
  • 有Foreign Key的 Model,就是設定belongs_to的 Model。

關聯的方法:
» has_one
» has_many
» belongs_to
» has_many :through
» has_and_belongs_to_many


關連:一對一

每位使用者(User)可以開一家店(Store)。

第一步:建立User 和 Store 兩個Model 和 資料表
rails g model User name email tel
這個指令會建立User的model,並且有一個name的欄位、email的欄位、tel的欄位,且型態皆為字串。
rails g model Store title tel address user_id:integer
這個指令會建立Store的model,並且有一個title的欄位、address的欄位、tel的欄位,且型態皆為字串。還有user_id 這個欄位且型態是整數。

user_id 這個欄位主要的用途是用來對應到 User Model 的 id 欄位,又稱它叫外部鍵(Foreign Key)。
這個欄位要叫什麼名字都可以,但在 Rails 裡的慣例,是「要被對到的那個 Model 的名字」加上 _id。
不是加上這個之後就會有關連!

在輸入以上兩行指令只會建立model,並聰明的在db裡面建立兩個migrate檔案,但真正的資料庫表還沒有建立。
所以我們還要輸入 rake db:migrate 讓資料庫表建立起來。
這樣Rails會將migrate的檔案執行,建立出兩個我們剛才輸入的資料庫表

第二步建立關聯

因為Model是翻譯員,我們透過Model去跟資料庫要資料。
建立好關係後,要去要資料的話。
Model的User 會去問 Model的Store ,這個時候Store去找他的資料表裡有沒有user_id是user的。


關聯: 一對多

一間商店(Store)可以賣很多商品(Product)

第一步:建立Product的Model 和 資料表
rails g model Product name description:text price:decimal is_available:boolean store_id:integer
這個指令會建立Product的model,會產生
name的欄位型態為字串。
description的欄位型態為文字。
price的欄位型態為數字。(數字型態會有小數點)
is_available的欄位型態為布林。
store_id的欄位型態為整數。(因為要讓 Product 可以對應到 Store)

記得輸入 rake db:migrate 讓資料庫表建立起來。
第二步建立關聯


此時Model之間的關聯圖


參考資料
為你自己學 Ruby on Rails
Ruby on Rails 實戰聖經


上一篇
[Day9]關於Rails ActiveRecord
下一篇
[Day11] Model 關聯 (下)
系列文
rails 學習紀錄14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言