柵協会は、レールの関連について知っているすべてです
8371 ワード
関連付けは2つのアクティブレコードモデル間の接続です.それはあなたのコードのレコードに様々な操作を実行することがはるかに容易になります.私は団体を4つのカテゴリーに分けました. 1から1への1つの 多くのへの
多くの の多くの多形の1〜多くの あなたがレールの上でルビーに新しいならば、あなたのrails projectを準備して、レールでcreate modelsへの方法をチェックしてください.
一対一
あなたが1対1の関係を設定するとき、あなたは記録がちょうどもう一つのモデルの1つのインスタンスを含むと言っています.たとえば、アプリケーションの各ユーザーが1つのプロファイルだけを持っている場合は、次のようにモデルを記述できます.
カバーは、すべてのあなたがそれをしたい方法を動作確認するRSpec testsとあなたの関連付けをカバーします.
多くの人
1対多の関連は最も一般的な使用関係です.このアソシエーションは、モデルAの各インスタンスが他のモデルBのゼロ以上のインスタンスを持つことができ、モデルBが1つのモデルAに属することを示す.
例を通してそれをチェックしましょう.ユーザーが複数のストーリーを書くことができるアプリケーションを作成したいなら、次のようにしてください.
2番目のモデルは最初のモデル関係については知りません.最初のモデルが1つ以上のリファレンスを持っているか、あるいは1つだけになっているかどうかはわかりません.
アソシエーションのテストは、より多くのリレーションシップを作成するためにより複雑になります.あなた自身のassociation factoriesあなたのテストの生活を容易にする方法を確認する必要があります.
多くへの多く
多くの多くの関連は、より複雑で、2つの方法で扱われることができます.
所有している多くの
例えば、ユーザは多くの異なる役割を持ち、同じ役割が多くのユーザを含むかもしれません.
が多い
多くの多くの関連を定義するもう一つの方法は、多くの相互結合型を使用することです.ここでは、2つの異なるものの間のその接続を扱うために、別々のモデルを定義しなければなりません.
代わりに新しい例を置く代わりに、this one outをチェックする必要があります!それはあなたがこの協会について知っておくべきすべてを説明します.
多型
多型協会は、我々の利用可能な最も先進的な団体です.あなたが単一の関連付けで多くの異なるモデルに属するかもしれないモデルがあるとき、あなたはそれを使うことができます.
あなたがユーザーと物語のコメントを書くことができることを想像しましょう.両方のモデルを解説したい.以下に宣言する方法を示します.
オプションオプション
モデル間の関係を定義するときに使用できるいくつかの追加オプションがあります.
クラス名
例:所有物を関係者に呼び出すには、2つの問題があります.そのような方法で呼ばれるモデルが、ありません. 物語表は、 簡単に修正!この作業を行い、tests from failingを停止するには、
依存
あなたが様々な問題につながることができるので、あなたが孤児化されたレコードを取り除く場合は、このオプションを使用することができます.モデルBに関連付けられたモデルAを削除または破棄すると、モデル化されたレコードが作成されますが、モデルBはそのプロセスで削除されませんでした.
読んでくれてありがとう!
この記事はもともとKolosek Blogに掲載されています.
多くの
一対一
あなたが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
フィールドを欠落しています.: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に掲載されています.
Reference
この問題について(柵協会は、レールの関連について知っているすべてです), 我々は、より多くの情報をここで見つけました https://dev.to/neshaz/everything-there-is-to-know-about-associations-in-rails-52iiテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol