柵協会は、レールの関連について知っているすべてです


関連付けは2つのアクティブレコードモデル間の接続です.それはあなたのコードのレコードに様々な操作を実行することがはるかに容易になります.私は団体を4つのカテゴリーに分けました.
  • 1から1への1つの
  • 多くのへの

  • 多くの
  • の多くの
  • 多形の1〜多くの
  • あなたがレールの上でルビーに新しいならば、あなたのrails projectを準備して、レールでcreate modelsへの方法をチェックしてください.

    一対一
    あなたが1対1の関係を設定するとき、あなたは記録がちょうどもう一つのモデルの1つのインスタンスを含むと言っています.たとえば、アプリケーションの各ユーザーが1つのプロファイルだけを持っている場合は、次のようにモデルを記述できます.
    class User < ApplicationRecord       class Profile < ApplicationRecord
      has_one :profile                     belongs_to :user
    end                                  end
    
    与えられた関係のモデルのうちの1つはhas_oneメソッド呼び出しを持っています、そして、もう一つはbelongs_toを持ちます.それは、どのモデルが外国のキー参照を他のものに含むかについて説明するのに使用されます.

    カバーは、すべてのあなたがそれをしたい方法を動作確認するRSpec testsとあなたの関連付けをカバーします.

    多くの人
    1対多の関連は最も一般的な使用関係です.このアソシエーションは、モデルAの各インスタンスが他のモデルBのゼロ以上のインスタンスを持つことができ、モデルBが1つのモデルAに属することを示す.
    例を通してそれをチェックしましょう.ユーザーが複数のストーリーを書くことができるアプリケーションを作成したいなら、次のようにしてください.
    class User < ApplicationRecord       class Story < ApplicationRecord
      has_many :stories                     belongs_to :user
    end                                  end
    
    ここで、どのモデルがhas_manyを持ち、belongs_toを持つかを決めるのは、1対1の関係よりも重要です.なぜなら、アプリケーションの論理を変更するからです.両方のケースでは、2番目のモデルには、外部キーの形で最初のモデルへの参照が1つ含まれます.
    2番目のモデルは最初のモデル関係については知りません.最初のモデルが1つ以上のリファレンスを持っているか、あるいは1つだけになっているかどうかはわかりません.

    アソシエーションのテストは、より多くのリレーションシップを作成するためにより複雑になります.あなた自身のassociation factoriesあなたのテストの生活を容易にする方法を確認する必要があります.

    多くへの多く
    多くの多くの関連は、より複雑で、2つの方法で扱われることができます.

    所有している多くのhas_and_belongs_to_many協会は、他のモデルと直接多くの多くの接続を作成します.それは、両方のモデルからhas_and_belongs_to_manyを呼び出す必要があるだけで、他のものより簡単です.

    例えば、ユーザは多くの異なる役割を持ち、同じ役割が多くのユーザを含むかもしれません.
    class User < ApplicationRecord       class Role < ApplicationRecord
      has_and_belongs_to_many :roles       has_and_belongs_to_many :users
    end                                  end
    
    この関連付けのための結合テーブルを作成する必要があります.つの異なるモデルを接続するテーブルです.結合テーブルは、別々のmigrationのRails機能create_join_table :user, :roleで作成されます.
    class CreateUserRoles < ActiveRecord::Migration
      def change
        create_table :user_roles, id: false do |t|
          t.references :user, index: true, foreign_key: true
          t.references :role, index: true, foreign_key: true
        end
      end
    end
    
    これは非常に簡単なアプローチですが、関連オブジェクトへの直接アクセスを持っていません.

    が多い
    多くの多くの関連を定義するもう一つの方法は、多くの相互結合型を使用することです.ここでは、2つの異なるものの間のその接続を扱うために、別々のモデルを定義しなければなりません.

    代わりに新しい例を置く代わりに、this one outをチェックする必要があります!それはあなたがこの協会について知っておくべきすべてを説明します.has_and_belongs_to_manyアソシエーションの例を使って、このように3つのモデルを書くべきです.
    class User < ApplicationRecord
      has_many :user_roles
      has_many :roles, through: :user_roles
    end
    
    class UserRoles < ApplicationRecord
      belongs_to :user
      belongs_to :role
    end
    
    class Role < ApplicationRecord
      has_many :user_roles
      has_many :users, through: :user_roles
    end
    
    この関連付けでは、user.roleのようなことを行い、すべての接続された2番目のモデルインスタンスの一覧を取得できます.また、最初と2番目のモデル間の関係に固有のデータへのアクセスを得ることができます.

    多型
    多型協会は、我々の利用可能な最も先進的な団体です.あなたが単一の関連付けで多くの異なるモデルに属するかもしれないモデルがあるとき、あなたはそれを使うことができます.

    あなたがユーザーと物語のコメントを書くことができることを想像しましょう.両方のモデルを解説したい.以下に宣言する方法を示します.
    class Comment < ApplicationRecord
      belongs_to :commentable, polymorphic: true
    end
    
    class Employee < ApplicationRecord
      has_many :comment, as: :commentable
    end
    
    class Product < ApplicationRecord
      has_many :comment, as: :commentable
    end
    
    任意の他のモデルが使用できるインターフェイスを設定するように、Polymorphic belongs_to宣言を考えることができます.典型的なインターフェイスを宣言するには、モデルの外部キー列と型列を宣言する必要があります.あなたが完了したら、run the migrationする必要があります.
    class CreateComments < ActiveRecord::Migration
      def change
        create_table :comments do |t|
          t.text :body
          t.integer :commentable_id
          t.string :commentable_type
          t.timestamps
        end
    
        add_index :comments, :commentable_id
      end
    end
    
    このマイグレーションは、参照を使用して簡単にできます.
    class CreateComments < ActiveRecord::Migration
      def change
        create_table :comments do |t|
          t.text :body
          t.references :commentable, polymorphic: true, index: true
          t.timestamps
        end
      end
    end
    

    オプションオプション
    モデル間の関係を定義するときに使用できるいくつかの追加オプションがあります.

    クラス名

    If the name of the other model cannot be derived from the association name, you can use the :class_name option to supply the model name. You can read more about this on RailsGuides.


    例:所有物を関係者に呼び出すには、2つの問題があります.
  • そのような方法で呼ばれるモデルが、ありません.
  • 物語表は、author_idフィールドを欠落しています.
  • 簡単に修正!この作業を行い、tests from failingを停止するには、:foreign_keyとクラスの実際の名前を指定するだけです.
    class Story < ApplicationRecord
      belongs_to :author, class_name: 'User', foreign_key: 'user_id'
    end
    

    依存
    あなたが様々な問題につながることができるので、あなたが孤児化されたレコードを取り除く場合は、このオプションを使用することができます.モデルBに関連付けられたモデルAを削除または破棄すると、モデル化されたレコードが作成されますが、モデルBはそのプロセスで削除されませんでした.
    class User < ApplicationRecord
      has_many :stories, dependent: :destroy
    end
    
    例えば、マリアと呼ばれるユーザーが多くの物語を書いたとします.それから、あなたはデータベースからマリアを削除しました、しかし、物語にはまだマリアのIDにセットされるユーザー名IDコラムがあります.
    読んでくれてありがとう!
    この記事はもともとKolosek Blogに掲載されています.