У нас есть 3 модели в нашем приложении: Поездки, Направления и CountryReferences (справочная таблица).Rails - Query has_many Association без дублирования себя
Наше описание ассоциации заключается в следующем:
- A Trip HAS_MANY Направления
- назначения has_one CountryReference
- A Trip HAS_MANY CountryReferences через Направления
CountryReference таблица представляет собой ссылку, которая отображает каждую страну в регионе и субрегионе с использованием iso_2 кода в качестве ключа. Например, Таиланд будет иметь регион Азии и субрегион Юго-Восточной Азии. Вся ассоциация проверена и работает правильно. Каждая поездка также имеет столбец «Виды».
Цель
Мы пытаемся создать метод, который возвращает массив с 6 самых популярных (# просмотров) Командировки в каждом регионе. Мы хотим избежать дублирования поездки, то есть, если путешествие охватывает несколько регионов, мы хотим только добавить его в массив один раз.
Наш Кодекс
#returns a an array of trips, this array should contain at least 'num_per_region' trips per region
def self.popular_by_region(num_per_region)
regions = []
regions.push 'Asia'
regions.push 'Europe'
regions.push 'Africa'
regions.push 'Central America and the Caribbean'
regions.push 'South America'
regions.push 'Australia and Oceania'
regions.push 'North America'
trips_array = []
trips_hash = {} #used to figure out if trip has already been added to array
#load 6 most popular trips per region
regions.each do |region|
region_trips = Trip.joins(:country_references).where('country_references.region' => region, 'published' => true).order(views: :desc).limit(num_per_region*3)
region_trips.each do |trip|
if trips_hash[trip.id].nil?
trips_hash[trip.id] = 1
trips_array.push trip
end
end
end
return trips_array
end
Проблема
ActiveRecord запрос Trip.join...
возвращается сразу срабатывать в пункт назначения. То есть, если моя поездка имеет 5 пунктов назначения, все в Азии, то эта же поездка будет возвращена 5 раз. Как мы можем настроить этот запрос так, чтобы каждая поездка возвращалась только один раз?
Заранее благодарим за помощь!