親子孫の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スコープまで値を渡す。
……本当に合っているか不明。もうちょっとスマートに書けないものかな?