Как отобразить уникальные записи из has_many через отношения?

Мне интересно, как лучше всего отображать уникальные записи из has_many через отношения в Rails3.

У меня есть три модели :

class User < ActiveRecord::Base
    has_many :orders
    has_many :products, :through => :orders
end

class Products < ActiveRecord::Base
    has_many :orders
    has_many :users, :through => :orders
end

class Order < ActiveRecord::Base
    belongs_to :user, :counter_cache => true 
    belongs_to :product, :counter_cache => true 
end

Допустим, я хочу перечислить все продукты, заказанные клиентом, на их странице выставки.

Возможно, они заказывали некоторые продукты несколько раз, поэтому я использую counter_cache для отображения в порядке убывания в зависимости от количества заказов.

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

@products = @user.products.ranked(:limit => 10).uniq!

работает, когда существует несколько записей заказа для продукта, но выдает ошибку, если товар был заказан только один раз. (ранжированная - это пользовательская функция сортировки, определенная в другом месте)

Другая альтернатива:

@products = @user.products.ranked(:limit => 10, :select => "DISTINCT(ID)")

Я не уверен, что использую здесь правильный подход.

Кто-нибудь еще занимался этим? С какими проблемами вы столкнулись? Где я могу узнать больше о разнице между .unique! и DISTINCT ()?

Как лучше всего сгенерировать список уникальных записей через has_many, через отношения?

Спасибо

101
задан Andy Harvey 1 May 2011 в 05:19
поделиться