Rails では、高速化するために何かを熱心にロードしようとしています。親-子-孫の状況がありますが、必要なのは親と孫の属性だけです。もし私が...
Parent.all.includes(:child => :grandchild)
次に、Bullet は未使用の子の熱心なロードについて不満を述べます (これは本当です。私はそれを必要としません)。Parent レコードと Grandchild.some_attribute にアクセスする簡単な方法はありますか?
Rails では、高速化するために何かを熱心にロードしようとしています。親-子-孫の状況がありますが、必要なのは親と孫の属性だけです。もし私が...
Parent.all.includes(:child => :grandchild)
次に、Bullet は未使用の子の熱心なロードについて不満を述べます (これは本当です。私はそれを必要としません)。Parent レコードと Grandchild.some_attribute にアクセスする簡単な方法はありますか?
いくつかのオプション...
1)孫の値を親にキャッシュします(データベースを非正規化し、列を追加して属性を保存します)。孫が 1 人だけで、多くの親がいる状況でこの値を頻繁に表示したい場合は、これを行います。
2) 孫に対して has_many :through を実行できますか? 次に、include(:grandchildren)
. これにより、子オブジェクトの生成を節約できます。
3) 本当に子と孫 (has_ones、または belongs_to) である場合、親 ID に基づいて孫に対してクエリ (またはスコープ) を実行する簡単な方法をおそらく見つけることができます。次に、parent.all を取得するクエリと get を取得するクエリの 2 つのクエリを実行しgrandchild.grandchild_of(parents.map(&:id))
、Ruby でループして属性を属性として親に追加し、後で親をループするときに使用できるようにします。
4) 最後に、特定の手作業による SQL クエリを実行して、親の属性と孫の属性を選択します。属性は親にアタッチされ、parent.grandchild_attribute_name によってアクセス可能になります。 Parent.select('parents.*, grandchild.attribute').joins(:grandchild)
. モデルによっては、これを試す必要があります。