Извлечение уникальных связанных моделей из массива другой модели - PullRequest
3 голосов
/ 21 августа 2010

Каков рекомендуемый подход для поиска нескольких уникальных связанных моделей для подмножества другой модели?Например, для подмножества пользователей определите уникальные модели исполнителей, которым они отдали предпочтение.

Один из подходов состоит в том, чтобы извлечь пользователей из базы данных, а затем выполнить итерацию всех запросов к избранным и создать уникальный массив, но этокажется довольно неэффективным и медленным.

class User < ActiveRecord::Base
  has_many :favorites
end

class Artist < ActiveRecord::Base
  has_many :favorites
end

class Favorite < ActiveRecord::Base
  belongs_to :user
  belongs_to :artist
end

@users = User.find_by_age(26)
# then determine unique favorited artists for this subset of users.

1 Ответ

7 голосов
/ 21 августа 2010

Ассоциация has_many имеет параметр под названием uniq для этого требования:

class User < ActiveRecord::Base
  has_many :favorites
  has_many :artists, :through => :favorites, :uniq => true
end

class Artist < ActiveRecord::Base
  has_many :favorites
  has_many :users, :through => :favorites, :uniq => true
end

class Favorite < ActiveRecord::Base
  belongs_to :user
  belongs_to :artist
end

Использование:

# if you are expecting an array of users, then use find_all instead of find_
@users = User.find_all_by_age(26, :include => :artists)
@users.each do |user|
  user.artists # unique artists
end

Изменить 1

Я обновил ответ на основе комментария пользователя.

Решение 1-: группа

Artist.all(:joins => :users, :group => :id, 
  :conditions => ["users.age = ?", 26])

Решение 2 - ВЫБЕРИТЕ ОТЛИЧИЕ

Artist.all(:joins => :users, :select => "DISTINCT artists.*", 
  :conditions => ["users.age = ?", 26]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...