2011-12-19 12 views
0

私はRails 3.0.10を使用しています。 Building has_many FloorsおよびFloor has_many Suitesである。少なくとも1つのSuiteを持つBuildingsをすべて取得したいと思います。 (必ずしもすべての建物はそれでスイートルームがあり、一部には、例えば、まだ建設中です。)Railsで異なる結合レコードをフェッチするにはどうすればよいですか?

いくつかの注意点:Building.joins(:floors, :suites)ような何かがうまくいかないよう

  • 私は、ユニークなレコードをしたいです。

  • 多くの建物があります。私は地元の巨大なコレクションを持ち帰りたくないのですが、その後は#uniqです。

  • 可能であれば、文字列参照を避けることをお勧めします。たとえば、私はBuilding.joins(:floors, :suites).select("distinct buildings.id")のようなことをしたくありません。

  • これは、select distinct buildings.id from buildings inner join floors on floors.building_id = buildings.id inner join suites on suites.floor_id;のような単一のSQLクエリで実行できます。したがって、このアプローチでも1つのクエリだけが必要な場合は最適です。

これは、ActiveRecord/ARel/Railsコアを使用する他のセマンティックを使用してどのようにするのが最適でしょうか?私はこれを行ういくつかの異なる方法を思いついたが、私は何が最も標準的であるか分からない。 3 SQL-クエリで

答えて

1

Building.where(:id => Floor.where(:id => Suite.all.collect(&:floor_id).uniq).collect(&:building_id)) 
+0

あなたはメモリにすべての 'Floor'内のすべての' Suite'をロードするためIMO、これは良い方法ではありません。それは不必要にインスタンス化されたオブジェクトの多くです!ここでは建物だけを取りに行きたいと思っています。 –

+0

フロアにcounter_cachesを追加すると、2つのSQLクエリだけが必要になります。 – Lichtamberg

+0

これは、上記の条件のうちの1つを破るRailsコアに固執しません。また、SQLが比較的簡単な文でそれを行うことができるならば、Railsも同様にできるはずだと感じます。 –

関連する問題