Как мне получить отдельные объединенные записи в Rails? - PullRequest
0 голосов
/ 19 декабря 2011

Я использую Rails 3.0.10.A Building has_many Floors и Floor has_many Suites.Я хотел бы получить все Buildings хотя бы с одним Suite.(Не в каждом здании есть свиты; например, некоторые еще находятся в процессе строительства.)

Некоторые предостережения:

  • Я хочу только уникальные записи, поэтому что-то вродеBuilding.joins(:floors, :suites) не работает.

  • Есть много зданий.Я не хочу возвращать огромную коллекцию локально, а затем #uniq it.

  • Я бы предпочел избегать ссылок на строки, где это возможно.Например, я не хочу делать что-то вроде 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 Ответ

1 голос
/ 19 декабря 2011

С 3 запросами Sql:

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