後へ      Topへ      次へ

references: 外部キー参照

中級

Scaffold で floor:references のように設定しました。
この references は「外部キー参照」といいます。

サンプルプログラムの場合、
まず Floor があって、
各Floor に複数の Cabinet が置かれています。
Cabinet が自分の所属している Floor を知っていると便利なので、
Cabinet に floor_id (= 自分が所属している Floor の ID) を格納しています。

floor_id に入っている値は単なる整数でしかないのですが、
Rails の定義段階で references を宣言すると、
2つのテーブルが連携して非常に使い勝手が良くなります。

具体的には、  
cabinet = Cabinet.find(1) # ID:1 の Cabinet データを取得
floor = cabinet.floor     # cabinet が属している floor データを取得

references で無い場合は、
cabinet = Cabinet.find(1)
floor = Floor.find(cabinet.floor_id) # cabinet の floor_id で Floor を取り出す
のように少し面倒なコードになってしまいます。

サンプルプログラムでは、
Step → Cabinet → floor と連携しているので、
floor = Step.find(1).cabinet.floor
のように、直感的に分かりやすいチェーンで書けます。

references で無い場合は、
floor = Floor.find(Cabinet.find(Step.find(1).cabinet_id).floor_id)
みたいになるでしょうか。

 

belongs_to

cabinet.floor のようにチェーンが使えるのは、
Cabinet モデルに

class Cabinet < ApplicationRecord
  belongs_to :floor
  
  # 他のコード
end

のように belongs_to :floor があるからで、
(Cabinet は floor に属している、です)
Scaffold が設定してくれています。

has_many: 1対多

中級

前節で Cabinet → floor の関係を見ましたが、
逆の floor → Cabinet はどうでしょう?

Scaffold では該当する設定はしていないので、
必要なら手で追加する必要があります。
具体的には、Floor モデル中、

class Floor < ApplicationRecord
  has_many :cabinets

  # 他のコード
end

のように has_many :cabinets と追記します。
(Floor は多くの cabinets を持っている、です)
こうしておけば、 @floor.cabinets で、
@floor に属している cabinet の一覧を取得できます。
こちらは、cabinets と複数形になっている事に注意してください。
@floor.cabinet だとエラーになります。

ちなみに、
1対1 や、多対多、など色々なパターンがありますので、
詳細が必要であれば、Rails ドキュメント を参照してください。


後へ      Topへ      次へ