2011-12-19 3 views
0

Я использую Rails 3.0.10. A Building has_many Floors и a Floor has_many Suites. Я хотел бы получить все Buildings, по крайней мере, с одним Suite. (Не каждое здание имеет апартаменты в нем, некоторые из них все еще в стадии строительства, например.)Как получить отдельные объединенные записи в 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

ИМО, это не хороший подход, потому что вы загрузите все 'Suite' в каждом' Floor' в память. Это много лишних экземпляров объектов! Мы хотим только получить Здания здесь. –

+0

Добавьте counter_caches на свои этажи, и вам нужны только 2 sql-запросы ..? – Lichtamberg

+0

Это не прилипает к ядру Rails, что нарушает одно из условий, упомянутых выше. Кроме того, если SQL может сделать это в относительно простом заявлении, похоже, что Rails также должен иметь возможность. –

Смежные вопросы