2011-12-19 67 views
0

我正在使用Rails 3.0.10。 A Building has_many Floors,和Floor has_many Suites。我想獲取至少一個Suite的所有Buildings。 (並不是每一個建築物中有套房;有的還在建設中,例如。)如何在Rails中獲取不同的連接記錄?

一些注意事項:

  • 我只希望唯一的記錄,所以像Building.joins(:floors, :suites)不起作用。

  • 有很多建築物。我不想在本地帶回一個巨大的收集,然後#uniq它。

  • 如果可能,我寧願避免字符串引用。例如,我不想做類似Building.joins(:floors, :suites).select("distinct buildings.id")的事情。

  • 這可以在單個SQL查詢中完成 - 例如select distinct buildings.id from buildings inner join floors on floors.building_id = buildings.id inner join suites on suites.floor_id;。所以最好這種方法只需要一個查詢。

使用ActiveRecord/ARel /使用Rails核心的其他語義的最佳方法是什麼?我已經想出了幾種不同的方式來做這件事,但我不確定什麼是最經典的。

回答

1

隨着3 SQL查詢:

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

IMO,因爲你在每一個'Floor'加載每個'Suite'到內存中,這是不是一個好方法。這是很多不必要的實例化對象!我們只想在這裏取建築物。 – 2011-12-19 20:21:23

+0

添加counter_caches到你的樓層,你只需要2個sql查詢..? – Lichtamberg 2011-12-19 20:24:31

+0

這不會堅持Rails核心,這打破了我上面提到的條件之一。另外,如果SQL可以用相對簡單的語句來實現,那麼感覺Rails應該也可以。 – 2011-12-19 20:31:02

相關問題