Ruby on Rails
アクティブレコード連合
サーチ…
属する
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
接続を作成します。
たとえば、アプリケーションにassemblies
とparts
含まれて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