Ruby on Rails 兩個資料表建立關聯

如果我們有兩個資料表,一個是商品分類資料表,一個是商品管理資料表,而商品管理的資料表會和商品分類的資料表做對應關聯

變成一個一對多, 和多對一的關係, 就是商品分類可以對應到很多的商品資料, 而商品資料只能對應到一個商品分類

那應該要怎麼在Rails裡面實現呢?

先將兩個資料表的model建立出來,在console打上

rails g model category name position:integer

這一行會建立一個category的model然後裡面會有一個name的欄位和形態為整數的position欄位

在console打上

rails g model item name description price:integer

這一行會建立一個item的model然後裡面會有name欄位,description欄位和型態為整數的price欄位

因為只有建立model還沒有建立真正的資料庫表,但打上以上指令Rails就會自動幫我們建立兩個db的migrate檔案

在db/migrate裡面

所以還要在console執行

rake db:migrate

這樣就會將migrate的檔案執行,產生真正的資料表

然後現在我們已經有兩個資料表了

但是關聯資料庫,如果有1對多和多對1的關係,就必須將兩個建立關聯

現在要Rails裡面的model裡面

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的欄位

所以在console打上

rails g migration add_category_id_to_items

然後到這個migration檔案裡面,本來長這樣

class AddCategoryIdToItems < ActiveRecord::Migration
def change
add_colums :items, :category_id, :integer
end
end

改成

class AddCategoryIdToItems < ActiveRecord::Migration
def change
add_colums :items, :category_id, :integer
end
end

然後到console執行

rails db:migrate

搞定!

但是如果是這樣的話,items資料表裡面的category_id還是nil值,資料還是沒完全關聯起來

到rails c裡面,打reload!重啓整理後

方法1 :

執行以下指令

# 找出Category id為3的

category_1 = Category.find(3)

# 找出Item id 為2的

item_1 = Item.find(2)

# 將此item加入category的群組,建立關聯

category_1.items << item_1

方法 2:

# 找出Category id為3的

category_1 = Category.find(3)

# 找出Item id 為2的

item_2 = Item.find(2)

# item的category_id = category的id

item_2.category = category_1

# 執行

item_2.save (比較特別的是,使方法要多打save讓他生效)

方法 3:

直接建立關聯的資料

# 找出Category id為3的

category_1 = Category.find(3)

# 打上item的name,description和price值

item_3 = category_1.items.create({name: “漢堡", description: “好嗎?" , price: 100})

(item 建立後就是category id 為3)

方法4:

也是直接建立關聯的資料

# 找出Category id為3的

category_1 = Category.find(3)

#打上item的name,descriotion和price值

item_4 = category_1.items.build({name: “漢堡", description: “好嗎?", price: 100})

# 執行

item_4.save

(比較特別要多打save才會生效)