Я использую 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? Я придумал несколько разных способов сделать это, но я не уверен, что является самым каноническим.
ИМО, это не хороший подход, потому что вы загрузите все 'Suite' в каждом' Floor' в память. Это много лишних экземпляров объектов! Мы хотим только получить Здания здесь. –
Добавьте counter_caches на свои этажи, и вам нужны только 2 sql-запросы ..? – Lichtamberg
Это не прилипает к ядру Rails, что нарушает одно из условий, упомянутых выше. Кроме того, если SQL может сделать это в относительно простом заявлении, похоже, что Rails также должен иметь возможность. –