2016-02-13 3 views
0

У нас есть 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 раз. Как мы можем настроить этот запрос так, чтобы каждая поездка возвращалась только один раз?

Заранее благодарим за помощь!

ответ

2

, пожалуйста, попробуйте это.

Trip.joins(:country_references).where('country_references.region' => region, 'published' => true).group('trips.id').order(views: :desc).limit(num_per_region*3)