想法
假設我們擁有兩個資料表,一個是商品分類資料表,一個則是商品管理資料表,而該如何將這兩個資料表在Rails上建立關聯?
一個分類裡面可以查詢到很多商品 -> 一對多 一個商品只有對應到一個分類 -> 一對一
實際操作
首先,先將兩個資料表建立,我們在終端機中輸入以下
rails g model category name:string position:integer
這個指令會建立catagory的model,並且有一個name的欄位型態為字串和position欄位型態為整數。
接下來我們在建立第二個資料表,輸入以下
rails g model item description:integer price:integer
這個指令會建立item的model,並且有一個description的欄位型態為整數和price欄位型態為整數。
在實作的時候輸入以上兩行指令只會建立model,並聰明的在db裡面建立兩個migrate檔案,但真正的資料庫表還沒有建立。
所以我們還要輸入 rake db:migrate
讓資料庫表建立起來。
這樣Rails會將migrate的檔案執行,建立出兩個我們剛才輸入的資料庫表
資料庫表兩個是建立起來了,但還沒將他們兩個之間的關聯做出來,所以我們繼續看下去
將原先的
class Category < ActiveRecord::Base
end
改為
class Category < ActiveRecord::Base
has_many :items
end
因為一個category可以有很多的items,也就是我們在一開始提到的想法,分類對應多項商品。
再來將
class Item < ActiveRecord::Base
end
改為
class Item < ActiveRecord::Base
belongs_to :category
end
因為item對應到一個category,一個商品只會被分到一種分類。
但是在兩個實體的資料表上還沒有建立關聯,因為item裡面並沒有category_id的欄位
所以我們回到終端機輸入
rails g migration add_category_id_to_items
這裡的migration雖沒有硬性規定命名方式,但是為了之後的維護跟可讀性,慣性必須打上淺顯易懂且具有意義的snake_name命名方式
接著到migrate檔案裡面,應該看到我們剛剛建立的檔案,名稱前面會是一些數字,我們需要修改它。
原先
class AddCategoryIdToItems < ActiveRecord::Migration
def change
end
end
改為
class AddCategoryIdToItems < ActiveRecord::Migration
def change
add_colums :items, :category_id, :integer
end
end
這樣就建立起兩個資料表彼此的關聯了。 建立完成一定要讓他跑db:migrtae跟server restart,否則會吃不到更新的檔案喔!
簡單的關聯先筆記到這邊 之後我們在做多型關聯的筆記吧XD