如果我們有兩個資料表,一個是商品分類資料表,一個是商品管理資料表,而商品管理的資料表會和商品分類的資料表做對應關聯
變成一個一對多, 和多對一的關係, 就是商品分類可以對應到很多的商品資料, 而商品資料只能對應到一個商品分類
那應該要怎麼在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才會生效)