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

Railsガイド メモ 9

programming

今日は、6.3 から。


  • 関連付けを 使用するからには、関連付けの設定に合わせてデータベースのスキーマを常に更新してお く責任が生じます。作成した関連付けにもよりますが、具体的には次の 2 つの作業が必要 になります。
  1. belongs_to 関連付けを使用する場合は、外部キーを作成する必要があ ります。

  2. has_and_belongs_to_many 関連付けを使用する場合は、適切な結合テーブ ルを作成する必要があります。
  • この関連付けに対応する assemblies_parts テーブルをマイグレーションで作成し、 裏付けておく必要があります。このテーブルには主キーを設定しないでください。
class CreateAssembliesPartsJoinTable < ActiveRecord::Migration 
  def change
    create_table :assemblies_parts , id: false do |t| 
      t.integer :assembly_id
      t.integer :part_id
    end 
  end
end

このテーブルはモデルを表さないので、create_table に id: false を渡します。こ うしておかないとこの関連付けは正常に動作しません。

  • あるモデルと異なる名前空間にあるモデルを関連付けるには、関連付けの宣言で完全なクラス名を指定する必要があります
module MyApplication module Business

    class Supplier < ActiveRecord::Base 
      has_one :account , class_name: "MyApplication::Billing::Account" end
    end

    module Billing
      class Account < ActiveRecord::Base
        belongs_to :supplier , class_name: "MyApplication::Business::Supplier"
      end
    end 

end
  • belongs_to で追加されるメソッド belongs_to 関連付けを宣言したクラスでは、以下の 5 つのメソッドを自動的に利用で きるようになります。
    • association(force_reload = false)
    • association=(associate)
    • build_association(attributes = {})
    • create_association(attributes = {})
    • create_association!(attributes = {})

これらのメソッドのうち、association の部分はプレースホルダであり、belongs_to の最初の引数である関連付け名をシンボルにしたものに置き換えられます。

  • belongs_to 関連付けでは以下のオプションがサポートされています。

    • :autosave
    • :class_name
    • :counter_cache • :dependent
    • :foreign_key
    • :inverse_of
    • :polymorphic
    • :touch
    • :validate
  • :counter_cache :counter_cache オプションは、従属しているオブジェクトの数の 検索効率を向上させます。

    • ここで 1 つ注意が必要です。:counter_cache オプションは belongs_to 宣言で指定 しますが、実際に数を数えたいカラムは、相手のモデル (関連付けられているモデル) の方 に追加する必要があります。上の場合には、Customer モデルの方に orders_count カラ ムを追加する必要があります。

mysql> SHOW CREATE TABLE customers;

CREATE TABLE `customers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  `orders_count` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 ;
  • :foreign_key
class Order < ActiveRecord::Base
    belongs_to :customer , class_name: "Patron", foreign_key: "patron_id"
end


Rails は外部キーのカラムを自動的に作ることはありません。外部キーを使用定義する必要があります。

  • 6.4.2 has_one 関連付けの詳細

    has_one で追加されるメソッド has_one 関連付けを宣言したクラスでは、以下の 5 つのメソッドを自動的に利用できるようになります。

    • association(force_reload = false)
    • association=(associate)
    • build_association(attributes = {})
    • create_association(attributes = {})
    • create_association!(attributes = {})
  • has_one 関連付けでは以下のオプションがサポートされます。

    • :as
    • :autosave
    • :class_name
    • :dependent
    • :foreign_key
    • :inverse_of
    • :primary_key
    • :source
    • :source_type
    • :through
    • :validate
  • 6.4.3 has_many 関連付けの詳細

  • has_many で追加されるメソッド
    has_many 関連付けを宣言したクラスでは、以下の 16 のメソッドを自動的に利用できるようになります。

    • collection(force_reload = false)
    • collection<<(object, …)
    • collection.delete(object, …)
    • collection.destroy(object, …)
    • collection=objects
    • collection_singular_ids ※collection_singularとは単数形
    • collection_singular_ids=ids ※collection_singularとは単数形
    • collection.clear
    • collection.empty?
    • collection.size
    • collection.find(…)
    • collection.where(…)
    • collection.exists?(…)
    • collection.build(attributes = {, …)}
    • collection.create(attributes = {)}
    • collection.create!(attributes = {)}

上のメソッドの collection の部分はプレースホルダであり、実際には has_many への 1 番目の引数として渡されたシンボルに置き換えられます。


6.4.3 まで読了。
しかし、読んだだけで実践で使わないと身につかないな。