2011-12-19 65 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

相关问题