Используйте готовую загрузку для предварительного извлечения ассоциаций из вашей базы данных:
Если вы извлекаете все свои события одновременно, вы можете изменить его, чтобы предварительно загрузить ассоциации местоположений для событий:
Event.all # only loads Event objects from the database
#maybe try...
Event.includes(:locations) # loads Event objects and their Locations
Если вам нужны события для какого-либо другого объекта (например, вашего @number
объекта), вы можете захотеть сделать что-то подобное в вашем контроллере, например:
@number = Number.where(:id => whatever).includes(:events => :locations)
Теперь в этом примере ваш @number
объект будет извлечен из базы данных вместе со всеми его событиями и местоположениями всех этих событий.
См. Руководство Rails для получения дополнительной информации об этом: http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations
Обновлено с моим ответом из комментариев :
Вместо того, чтобы вообще использовать области, вы можете просто использовать Ruby, чтобы выполнить всю работу за вас, и исключить ActiveRecord и дополнительные вызовы базы данных из цикла.
Enumerable#group_by
будет принимать коллекцию и группировать по указанному вами атрибуту. В этом случае вы можете взять все события, сгруппированные по городу и штату, а затем выполнить итерацию по возвращаемому хешу:
events = Event.all
events.group_by { |e| "#{e.city}, #{e.state}" }
# => {"Birmingham, AL" => [<event>, <event>, <event>], "Nashville, TN" => [<event>, <event>]}
Это может быть немного менее красиво, чем использование областей, но это позволяет вам сделать один вызов базы данных и оставить все как есть.