iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 11
1
自我挑戰組

Ruby菜鳥村村民遊記系列 第 11

遊記ep.11 關聯性的Rails村 -2

昨天介紹完 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 對 多的關聯性,
下一篇會介紹最常使用的應用 多 對 多的關聯~


上一篇
遊記ep.10 關聯性的Rails村
下一篇
遊記ep.12 外傳的Git村
系列文
Ruby菜鳥村村民遊記30

尚未有邦友留言

立即登入留言