niki12260714の日記

フリーランスのITエンジニアの呟き。

親子孫の3つのテーブルを関連付けてデータ取得

 A,B,Cというテーブルがあって、それぞれ親→子→孫という関係とします。

Aモデル:
has_many:bs(複数形)

Bモデル:
belongs_to:a(単数形)
has_many:cs(複数形)

Cモデル:
belongs_to:b(単数形)

ここで、cモデルにあるカラムをwhere句にして、Aモデルの値を取るとします。
やり方としては、

・Cモデルにscopeを定義する
scope :c_scope, ->(id) {where("c_id = ?", id)}

・Bモデルで、Cモデルをマージして、Cのスコープを呼び出すスコープを定義する
scope :b_scope, ->(id){
   joins(:cs).merge(C.c_scope(id))
}

・Aモデルで、Bモデルをマージして、Bのスコープを呼び出すスコープを定義する
scope :a_scope, ->(id){
   joins(:bs).merge(B.b_scope(id))
}

で、Aモデルのスコープ(a_scope)を呼び出すことで、Cスコープまで値を渡す。

……本当に合っているか不明。もうちょっとスマートに書けないものかな?