昨天介紹完 1 對 1的關聯,
我們所用的是 belongs_to 以及 has_one 來設定兩個 model 之間的關係,
現在我們來看一下 1 對 多的關係,
這裡要設定的情境為,1台鋼彈可以擁有很多種的武器,
那麼就先來建立一下武器庫的 model 吧!
rails g model Weapon name description damage gundam:references
Running via Spring preloader in process 71656
invoke active_record
create db/migrate/20190926141230_create_weapons.rb
create app/models/weapon.rb
invoke test_unit
create test/models/weapon_test.rb
create test/fixtures/weapons.yml
建立好 model 之後 不要忘記 rails db:migrate!
我們再進到 Weapon 以及 Gundam 兩個 model 來設定一下
class Weapon < ApplicationRecord
belongs_to :gundam
end
這裡建立的關係為 weapon 屬於 gundam
belongs_to 順便帶給我們 .gundam, .gundam= 兩個方法
class Gundam < ApplicationRecord
belongs_to :pilot
has_many :weapons
end
這裡建立的關係為 Gundam 有多個 weapons
has_many 順便帶給我們 .weapons, .wepaons=, .build, .create 四個方法
我們先建立 w1,w2,w3 這三種武器
並讓 g1 = Gundam.find(1) 這裡指的是 把id1號指定給 g1
g1.weapons = [w1,w2]
Weapon Load (0.8ms) SELECT "weapons".* FROM "weapons" WHERE "weapons"."gundam_id" = ? [["gundam_id", 1]]
(0.1ms) begin transaction
Weapon Create (1.3ms) INSERT INTO "weapons" ("name", "gundam_id", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["name", "saber bean"], ["gundam_id", 1], ["created_at", "2019-09-26 14:35:36.987726"], ["updated_at", "2019-09-26 14:35:36.987726"]]
Weapon Create (0.2ms) INSERT INTO "weapons" ("name", "gundam_id", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["name", "rifle bean"], ["gundam_id", 1], ["created_at", "2019-09-26 14:35:36.991104"], ["updated_at", "2019-09-26 14:35:36.991104"]]
(1.5ms) commit transaction
g1.weapons << w3
(0.3ms) begin transaction
Weapon Create (1.1ms) INSERT INTO "weapons" ("name", "gundam_id", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["name", "rifle HighPower"], ["gundam_id", 1], ["created_at", "2019-09-26 14:35:47.907468"], ["updated_at", "2019-09-26 14:35:47.907468"]]
(1.2ms) commit transaction
我們依序把 w1,w2,w3 丟給 g1 上
這裡我們使用的方法,如果要一次丟多數,可以使用 =[w1,w2]
, 也可以一項一項丟 << w3
現在我們可以來詢問 g1.weapons 有哪些呢?
g1.weapons
+----+------------+------------+--------+-----------+------------+-------------+
| id | name | descrip... | damage | gundam_id | created_at | updated_at |
+----+------------+------------+--------+-----------+------------+-------------+
| 1 | saber bean | | | 1 | 2019-09... | 2019-09-... |
| 2 | rifle bean | | | 1 | 2019-09... | 2019-09-... |
| 3 | rifle H... | | | 1 | 2019-09... | 2019-09-... |
+----+------------+------------+--------+-----------+------------+-------------+
現在他有了一把光束劍,一把來福槍,一把高出力來福槍。
當然也可以從 weapon 的角度 問 w1 是在哪台鋼彈上?
w1.gundam
+----+---------+--------+--------+----------+----------------+-----------------+
| id | code | height | weight | pilot_id | created_at | updated_at |
+----+---------+--------+--------+----------+----------------+-----------------+
| 1 | Freedom | | | 1 | 2019-09-25 ... | 2019-09-25 1... |
+----+---------+--------+--------+----------+----------------+-----------------+
目前 光束劍 正裝配在自由鋼彈身上。
以上就是 1 對 多的關聯性,
下一篇會介紹最常使用的應用 多 對 多的關聯~