モデルの関連付け/アソシエーション

  • belongs_to
  • has_one
  • has_many
  • has_and_belongs_to_many

参考:

Active Record の関連付け (アソシエーション) | Rails ガイド [公式]

belongs_to / has_one / has_many の簡単まとめ | 酒と涙とRubyとRailsと

Rails のリレーションのオプションでできること、まとめてみた。| ハッカーを目指す白Tのブログ

ActiveRecord::Associations

参考:

ActiveRecord::Associations::ClassMethods | Ruby on Rails API [Official]

ActiveRecord::Associations::CollectionProxy

参考:

ActiveRecord::Associations::CollectionProxy | Ruby on Rails API [Official]

実例

参考:

has_many と belongs_to のリレーションで データベースに保存する | RemoNote

has_many – belongs_to で都道府県データを持てるようにする | RemoNote

一対一の関連付け

参考:

Rails4 で1対1のリレーションをモデルに実装する | Rails Webook

一対多の関連付け

参考:

Rails のモデルと一対多のリレーションのまとめ | dev/mom0tomo

has_and_belongs_to_many

class Assembly < ApplicationRecord
  has_and_belongs_to_many :parts
end
 
class Part < ApplicationRecord
  has_and_belongs_to_many :assemblies
end

参考:

has_and_belongs_to_many 関連付け | Rails ガイド [公式]

Rails 4 HABTM how to set multiple ids in console? – Stack Overflow

関連モデルの生成

参考:

モデルの関連付けで build を使う時のメソッド名 – GitHub Gist

has_many 関連付けに条件を付ける

参考:

has_many で関連元のオブジェクトに依存した条件を付けたいとき | falcon’s Diary

Use a scope by default on a Rails has_many relationship – Stack Overflow

has_many through 関連付け

参考:

has_many through で,class_name とか foreign_key をちゃんと復習してみる | PartyIX

Rails4 の has_many through で多対多のリレーションを実装する – Qiita

has_many through な関係で、複数レコードを new/create する時の書き方 – Qiita

Rails の has_many :through の多対多のモデルについて | teratail

How a has_many :through association works in practice | Duck Type Labs

When should one use a “has_many :through” relation in Rails? – Stack Overflow

save instance into join table – Stack Overflow

dependent オプション

レコードを削除する際の関連レコードの扱いを指定する。

  • :destroy:関連レコードを同時に削除する (コールバックが呼ばれる)
  • :delete_all:関連レコードを同時に削除する (コールバックは呼ばれない)
  • :nullify:関連レコードにおける外部キーを NULL にする
  • :restrict_with_exception:例外を発生させる (関連レコードが存在する場合は削除できない)
  • :restrict_with_error:エラー情報を付与する (関連レコードが存在する場合は削除できない)
  • nil:何もしない (デフォルト)

参考:

ActiveRecord::has_many の dependent オプション | blog.sanojimaru.com

dependent: :restrict_with_error と :restrict_with_exception の違い – Qiita

ActiveRecord の :dependent 使い分けまとめ : destroy, :delete, :nullify|IT エンジニアのノマド生活

has_many の dependent オプションについて – Qiita

モデルを削除するときに同時に中間テーブルに存在するレコードも削除する has_many dependent: destroy | PG-Happy ブログ

has_many – ActiveRecord::Associations::ClassMethods | Ruby on Rails API [Official]

rails で dependent: : destroy を設定したのに削除されない – スタック・オーバーフロー

touch

関連レコードの更新日時を同時に更新する。

参考:

touch, touch, updated_at に touch – Qiita

touch オプションで updated_at を更新する | Murajun’s Style

delegate

メソッドを関連モデルに delegate する。

参考:

delegate | maeshima の日記

has_many, through の逆の関連は delegate, to か has_one, through | Hack Your Design!

Delegate | Simone Carletti

has_many でツリー状の関連付けを行う

参考:

ActiveRecord でツリー関係の関連を定義する | それは Books

polymorphic

class Picture < ApplicationRecord
  belongs_to :imageable, polymorphic: true
end
 
class Employee < ApplicationRecord
  has_many :pictures, as: :imageable
end
 
class Product < ApplicationRecord
  has_many :pictures, as: :imageable
end

参考:

ポリモーフィック関連付け | Rails ガイド [公式]

条件付きの関連付け

参考:

ID を使わず複合条件で has_many – Qiita

命名規則外のカラム名を使って関連付け (class_name)

class Book < ApplicationRecord
  belongs_to :writer, class_name: "Author", foreign_key: "author_id"
end

参考:

自己結合 | Rails ガイド [公式]

双方向関連付け | Rails ガイド [公式]

関連付けのスコープ制御 | Rails ガイド [公式]

has many – Rails has_many with alias name – Stack Overflow

関連付けを動的に生成する

参考:

Dynamically Defined has_many with odd behavior | GoRails

Dynamic class_name for has_many relations – Stack Overflow

Dynamic association generation in ActiveRecord – Code Review Stack Exchange

エンジンのモデルを関連付けする

参考:

Rails Engine でマウントする側のモデルとされる側のモデルの association | mmag

parndt/decorators: Manages the process of loading decorators into your Rails application – GitHub

How to set has_many association between parent app’s model and mounted engine’s model? – Stack Overflow

エンジンのモデルを共有して使う

参考:

Rails の model を Engine で共有する (実験中) – Qiita

中間テーブルにおける組み合わせの重複

参考:

SQL の多対多リレーションを「集合」で扱う 翻訳 | TechRacho

AssociationRelation

参考:

ActiveRecord::AssociationRelation | Ruby on Rails API [Official]

rails/association_relation.rb at v5.2.2 · rails/rails – GitHub

BelongsTo

参考:

rails/belongs_to.rb at v6.0.0.rc1 · rails/rails – GitHub

ActiveRecord::Associations::CollectionProxy

参考:

ActiveRecord::Associations::CollectionProxy | Ruby on Rails API [Official]

STI / becomes

参考:

シングルテーブル継承 (STI) | Rails ガイド [公式]

Single Table Inheritance – Problems and solutions | Arkency Blog

becomes – ActiveRecord::Persistence | Ruby on Rails API [Official]

まとめ/チートシート

参考:

Associations – Rails models cheatsheet | Devhints

Tips

参考:

Non-standard ActiveRecord | Codeando con Ruby

Single Table Inheritance – Problems and solutions | Arkency Blog

has-many-with-set

参考:

ebobby/has-many-with-set: A smarter way to have many-to-many relationships – GitHub

タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です