Получить массив многих ассоциаций объектов

Я не знал точно, как найти понятное название, поэтому я постараюсь объяснить свою проблему.

У меня есть 2 модели: - Страна, которую можно перевести с помощью globalize, с именем и многими регионами - Регион принадлежит стране

Я хотел бы получить массив всех регионов из массива стран.

E.g.

Country.all.regions
Country.with_translations(I18n.locale).order("country_translations.name asc").regions

Есть ли простой способ получить этот массив?


person Ugo Mare    schedule 27.01.2015    source источник
comment
Country.all.map {|страна| страна.регионы }.flatten   -  person cristian    schedule 27.01.2015
comment
Спасибо, это именно то, что я искал. Я ответил вашим ответом для других!   -  person Ugo Mare    schedule 27.01.2015


Ответы (3)


Решение @Octopus-Paul работает, но у него проблема с запросами n+1. Чтобы этого избежать, используйте метод includes.

Country.includes(:regions).all.map {|country| country.regions }.flatten

Подробнее читайте здесь: http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations

person Rodrigo    schedule 27.01.2015
comment
Один хороший трюк, который вы можете сделать, это использовать .flat_map{ ... } вместо .map{ ... }.flatten. - person antinome; 24.04.2015
comment
Еще одна вещь, которую вы можете сделать, чтобы очистить его: Country.includes(:regions).all.flat_map(&:regions) - person Devchris; 14.04.2021

От @Octopus-Paul:

Country.all.map {|country| country.regions }.flatten
person Ugo Mare    schedule 27.01.2015

Просто найдите регионы, соответствующие вашему списку стран:

countries = Country.all
regions = Region.where(country: countries)
person Edison Arango    schedule 16.07.2019
comment
Я знаю, что это довольно явно, но попробуйте добавить немного больше текста, чтобы объяснить, почему ваше решение является хорошим. - person Olympiloutre; 16.07.2019