over 2 years ago

想法

假設我們擁有兩個資料表,一個是商品分類資料表,一個則是商品管理資料表,而該如何將這兩個資料表在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的檔案執行,建立出兩個我們剛才輸入的資料庫表

資料庫表兩個是建立起來了,但還沒將他們兩個之間的關聯做出來,所以我們繼續看下去

將原先的

model/category.rb
class Category < ActiveRecord::Base
end

改為

model/category.rb
class Category < ActiveRecord::Base
has_many :items
end

因為一個category可以有很多的items,也就是我們在一開始提到的想法,分類對應多項商品。

再來將

model/item.rb
class Item < ActiveRecord::Base
end

改為

model/item.rb
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檔案裡面,應該看到我們剛剛建立的檔案,名稱前面會是一些數字,我們需要修改它。

原先

db/migrate/一堆數字add_category_id_to_items.rb
class AddCategoryIdToItems < ActiveRecord::Migration
    def change
    end
end

改為

db/migrate/一堆數字add_category_id_to_items.rb
class AddCategoryIdToItems < ActiveRecord::Migration
    def change
    add_colums :items, :category_id, :integer
    end
end

這樣就建立起兩個資料表彼此的關聯了。
建立完成一定要讓他跑db:migrtae跟server restart,否則會吃不到更新的檔案喔!

簡單的關聯先筆記到這邊
之後我們在做多型關聯的筆記吧XD

← [gem] 實現投票功能,acts_as_votable 一個新鮮人找尋Rails工作的面試經驗 →
 
comments powered by Disqus