Как вернуть уникальные записи в (несколько) ассоциаций в Rails 3.2

Прежде всего, спасибо всем, кто нашел время, чтобы прочитать этот пост. Большое, большое спасибо заранее.

Я пытаюсь выяснить, как получить все уникальные имена местоположений, которые могут быть у поставщика.

Моя первая идея состояла в том, чтобы написать метод в модели Provider, который будет перебирать все курсы, а затем их появление и возвращать список уникальных местоположений.

Я просмотрел метод .uniq в Rails API, но безуспешно.

Вот как выглядят мои разные модели/ассоциации:

модели /provider.rb

class Provider < ActiveRecord::Base
  has_many :courses
  has_many :teachers
end

модели/курс.рб

class Course < ActiveRecord::Base
  has_many :occurrences, :dependent => :destroy
  belongs_to :provider
end

модели/вхождение.рб

class Occurrence < ActiveRecord::Base
  belongs_to :course
  belongs_to :location
end

модели/местоположение.рб

class Location < ActiveRecord::Base
  attr_accessible :name
  has_many :occurrences
end 

Каков наилучший способ добиться этого?

Прочитав комментарии, я попробовал это:

Я создал метод unique_locations в модели Provider, он имеет следующий код (на основе вашего ответа)

def unique_locations
  Location.joins(occurrences: :course).where(courses: { provider_id: self.id }).uniq.pluck('locations.name')
end`

и используя его, на мой взгляд:

<% @provider.unique_locations.each do |l| %>
  <%= l %><br>
<% end %>`

Но я все еще получаю неуникальные результаты. Любые идеи?


person Francis Ouellet    schedule 07.02.2013    source источник
comment
Почему .uniq не работает?   -  person Kleber S.    schedule 07.02.2013


Ответы (1)


Вы можете попробовать Location.uniq.pluck(:name), который вернет массив уникальных имен местоположений. Переходя от провайдера, вы должны использовать :joins (учитывая @provider)

Location.joins(occurences: :course).where(courses: { provider_id: @provider.id }).uniq.pluck('locations.name')
person jvnill    schedule 07.02.2013
comment
Добавлено больше информации в исходный пост @jvnill - person Francis Ouellet; 07.02.2013
comment
Ах, это сделало трюк хорошо! Следует ли писать метод такого типа в соответствии с передовыми практиками, или мне было бы лучше написать область действия? - person Francis Ouellet; 07.02.2013
comment
Вы можете добавить еще 2 ассоциации has_many к провайдеру. has_many :occurences, through: :courses и has_many :locations, through: :occurences, то просто позвоните provider.locations.uniq.pluck(:name) - person jvnill; 07.02.2013