読者です 読者をやめる 読者になる 読者になる

Railsガイド メモ 8

programming

今日は第6章を読む。 いつも通り、以下は本文からのコピペ。加筆修正はしていない。


  • belongs_to 関連付けで指定するモデル名は必ず「単数形」にしなければ なりません。上の場合、Order モデルにおける関連付けの customer を複数形の customers にしてしまうと、"uninitialized constant Order::Customers" エラーが 発生します。

  • 関連付けに対応するマイグレーションは以下のような感じになります。

create_table :orders do |t| 
    t.belongs_to :customer
    t.datetime :order_date
    t.timestamps 
end
  • Rails でサポートされている関連付けは以下の 6 種類です。

    • belongs_to
    • has_one
    • has_many
    • has_many :through
    • has_one :through
    • has_and_belongs_to_many
  • has_many :through 関連付けは、ネストした has_many 関連付けを介して「ショー トカット」を設定する場合にも便利です。たとえば、1 つのドキュメントに多くの節 (section) があり、1 つの節の下に多くの段落 (paragraph) がある状態で、節をスキップ してドキュメントの下のすべての段落の単純なコレクションが欲しいとします。その場 合、以下の方法で設定できます。

class Document < ActiveRecord::Base 
    has_many :sections
    has_many :paragraphs , through: :sections
end

class Section < ActiveRecord::Base
    belongs_to :document
    has_many :paragraphs 
end

class Paragraph < ActiveRecord::Base 
    belongs_to :section
end

through: :sections と指定することにより、Rails は以下の文を理解できるように なります。

@document.paragraphs
  • マイグレーションで t.integer :supplier_id のように「小文字のモデル 名_id」と書くと、外部キーを明示的に指定できます。新しいバージョンの Rails で は、同じことをt.references :supplierという方法で記述できます。こちらの方 が実装の詳細が抽象化され、隠蔽されます。

  • リレーションシップのモデルで何か特別なことをする必要が まったくないのであれば、結合モデルの不要な has_and_belongs_to_many リレーショ ンシップを使用するのがシンプルです (ただし、こちらの場合は結合モデルが不要な代わ りに、専用の結合テーブルを別途データベースに作成しておく必要がありますので、お忘 れなきよう)。

  • 6.2.10 自己結合

class Employee < ActiveRecord::Base
  has_many :subordinates , class_name: "Employee", foreign_key: "manager_id"
  belongs_to :manager , class_name: "Employee" 
end

上のように宣言しておくと、@employee.subordinates と@employee.manager が使 用できるようになります。


以下は自分で調べた。

create_table :accounts do |t|
    t.references :supplier
end

だけだと、テーブルに supplier_id というカラムが追加され、それにインデクスが設定されるが 外部キー参照制約は付加されない。 もし、作成されるテーブルに外部キー参照制約を付加したいときは、

create_table :accounts do |t|
    t.references :supplier, foreign_key: true
end

とする。

それと以下も参考にさせて頂いた。
Railsでhas_and_belongs_to_manyのモデルを作成する

明日は、6.3 から読む。