Rails ActiveRecord において、
深い階層のテーブルを参照するのに有効な方法はないでしょうか?
例:下記の構造で classD から classAのnameを取得する。
classA 1→n classB 1→n classC 1→n classD
□classA
id
name
□classB
id
name
class_a_id
□classC
id
name
class_b_id
□classD
id
name
class_c_id
#前提条件
classC, classB, classAが必ずしも存在するとは限らない。
classDからclassAを参照する際に、#前提条件にあるように、
classB or classCが存在しない(nil)場合、
> class_d.class_c.class_b.class_a.name
とするとエクセプションが発生しますが、
これを回避するために、
if class_d.class_c and class_d.class_c.class_b and class_d.class_c.class_b.class_a
class_d.class_c.class_b.class_a.name
end
のようにしていますが、煩わしくてしかたがありません。
実際はエラーログ出力等行っているため、さらに複雑な処理になっています。
もっとスマートなコーディング方法やアドバイスがありましたら宜しくお願いします。
#補足
(1) has_many :through を使ってショートカットが作れることを知りましたが、
今回の例のように、複数階層となる場合の記述方法がわかりません。
ご存知の方回答お願いいたします。
(2) そもそも前提条件に問題があるのではないかとも思っています。
前提条件にあるような状態にならない様な仕組みにする、
もしくは、そのような状態にならないよう管理する、等すべきでしょうか?
以上宜しくお願いいたします。
> if class_d.class_c and class_d.class_c.class_b and class_d.class_c.class_b.class_a
> class_d.class_c.class_b.class_a.name
> end
> のようにしていますが、煩わしくてしかたがありません。
単純に classD にそのようなメソッドを一つ定義して
他ではそれを呼び出せばいいんじゃないの?