サーチ…


属する

belongs_toアソシエーションは、別のモデルと1対1の接続を設定するため、宣言するモデルの各インスタンスは、他のモデルの1つのインスタンスに属します。

たとえば、アプリケーションにユーザーと投稿が含まれていて、各投稿を正確に1人のユーザーに割り当てることができる場合は、この方法で投稿モデルを宣言します。

class Post < ApplicationRecord
  belongs_to :user
end

あなたのテーブル構造では、

create_table "posts", force: :cascade do |t|
  t.integer  "user_id",  limit: 4
end

has_one

has_oneアソシエーションは、別のモデルと1対1の接続を設定しますが、セマンティクスは異なります。この関連付けは、モデルの各インスタンスが別のモデルの1つのインスタンスを含むか、または所有していることを示します。

たとえば、アプリケーション内の各ユーザーにアカウントが1つしかない場合は、次のようにユーザーモデルを宣言します。

class User < ApplicationRecord
  has_one :account
end

アクティブレコードでは、 has_oneリレーションがある場合、アクティブレコードは、外部キーを持つレコードが1つだけ存在することを保証します。

この例では、Accountテーブルでは、特定のuser_idを持つレコードが1つしか存在しません。同じユーザーに対してもう1つのアカウントを関連付けると、以前のエントリの外部キーがnull(孤立)になり、新しいエントリが自動的に作成されます。整合性を維持するために新しいエントリの保存に失敗した場合でも、前のエントリはnullになります。

user = User.first
user.build_account(name: "sample")
user.save   [Saves it successfully, and creates an entry in accounts table with user_id 1]
user.build_account(name: "sample1")  [automatically makes the previous entry's foreign key null]
user.save  [creates the new account with name sample 1 and user_id 1]

多くを持っています

has_manyアソシエーションは、別のモデルとの1 has_many接続を示します。この関連付けは、一般的にbelongs_to関連付けの反対側に位置します。

この関連付けは、モデルの各インスタンスに別のモデルのインスタンスがゼロ以上あることを示します。

たとえば、ユーザーと投稿を含むアプリケーションでは、ユーザーモデルは次のように宣言できます。

class User < ApplicationRecord
  has_many :posts
end

Postのテーブル構造はbelongs_to例と同じです。対照的に、 Userはスキーマの変更を必要としません。

User公開されたすべての投稿のリストを取得する場合は、以下を追加できます(つまり、関連付けオブジェクトにスコープを追加できます)。

class User < ApplicationRecord
  has_many :published_posts, -> { where("posts.published IS TRUE") }, class_name: "Post"
end

多型関連

このタイプの関連付けにより、ActiveRecordモデルは複数の種類のモデルレコードに属することができます。一般的な例:

class Human < ActiveRecord::Base
  has_one :address, :as => :addressable
end

class Company < ActiveRecord::Base
  has_one :address, :as => :addressable
end

class Address < ActiveRecord::Base
  belongs_to :addressable, :polymorphic => true
end

この関連付けがなければ、Addressテーブルにこれらの外部キーがすべてありますが、このシナリオではアドレスは1つのエンティティ(HumanまたはCompany)にしか属していないため、いずれかの値を持つことになります。これは、次のようになります。

class Address < ActiveRecord::Base
  belongs_to :human
  belongs_to :company
end

has_many:throughアソシエーション

has_many :throughアソシエーションは、他のモデルとmany-to-many接続を設定するためによく使用されます。この関連付けは、第3のモデルを進めることによって、宣言モデルが他のモデルの0個以上のインスタンスと一致し得ることを示す。

例えば、患者が医師に診察を依頼する診療を考えてみましょう。関連する宣言は次のようになります。

class Physician < ApplicationRecord
  has_many :appointments
  has_many :patients, through: :appointments
end

class Appointment < ApplicationRecord
  belongs_to :physician
  belongs_to :patient
end

class Patient < ApplicationRecord
  has_many :appointments
  has_many :physicians, through: :appointments
end

has_one:throughアソシエーション

has_one :through associationは、別のモデルとone-to-one接続を設定します。この関連付けは、第3のモデルを進めることによって、宣言モデルが別のモデルの1つのインスタンスと一致し得ることを示す。

たとえば、各supplierが1つのaccountを持ち、各アカウントが1つのアカウント履歴に関連付けられている場合、サプライヤモデルは次のようになります。

class Supplier < ApplicationRecord
  has_one :account
  has_one :account_history, through: :account
end

class Account < ApplicationRecord
  belongs_to :supplier
  has_one :account_history
end

class AccountHistory < ApplicationRecord
  belongs_to :account
end

has_and_belongs_to_manyアソシエーション

has_and_belongs_to_manyアソシエーションは、モデルを介在させずに別のモデルと直接many-to-many接続を作成します。

たとえば、アプリケーションにassembliesparts含まれてparts 、各アセンブリに多数のパーツがあり、各パーツが多くのアセンブリに表示されている場合は、次のようにモデルを宣言できます。

class Assembly < ApplicationRecord
  has_and_belongs_to_many :parts
end

class Part < ApplicationRecord
  has_and_belongs_to_many :assemblies
end

自己参照協会

自己参照結合は、モデルをそれ自身に関連付けるために使用されます。最も頻繁な例は、友人と彼の信者との関連を管理することです。

例。

rails g model friendship user_id:references friend_id:integer

今では、モデルを関連付けることができます。

class User < ActiveRecord::Base
  has_many :friendships
  has_many :friends, :through => :friendships
  has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
  has_many :inverse_friends, :through => :inverse_friendships, :source => :user
end

他のモデルは次のようになります。

class Friendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, :class_name => "User"
end


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow