こんにちは。
Railsで、親子関係のrelationで子がない親だけを取り出すscopeの書き方についてです。
親子関係のrelation
例えば、次のような親子関係のモデルがあるとします。
class Parent < ApplicationRecord
has_many :children
end
class Child < ApplicationRecord
belongs_to :parent
end
この場合、Parent
モデルにはhas_many :children
という関連があり、Child
モデルにはbelongs_to :parent
という関連があります。
このとき、Parent
モデルには、子がいる親と子がいない親が存在します。
子がない親だけを取り出すscope
子がない親だけを取り出すためのscopeを書くには、次のようにします。
class Parent < ApplicationRecord
has_many :children
scope :without_children, -> {
left_joins(:children).where(children: { id: nil })
}
end
このscopeは、Parent
モデルに対してwithout_children
というメソッドを追加します。
このメソッドは、left_joins(:children)
でchildren
テーブルを左外部結合し、where(children: { id: nil })
でchildren
テーブルのid
がnil
であるレコードを取り出します。
このようにすることで、子がない親だけを取り出すことができます。
今回はこのあたりで。