Je me demande quelle est la meilleure façon d'afficher des enregistrements uniques à partir d'un has_many, via une relation dans Rails3.
J'ai trois modèles:
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
Disons que je veux lister tous les produits qu'un client a commandés sur sa page de présentation.
Ils ont peut-être commandé certains produits plusieurs fois, j'utilise donc counter_cache pour les afficher par ordre décroissant, en fonction du nombre de commandes.
Mais, s'ils ont commandé un produit plusieurs fois, je dois m'assurer que chaque produit n'est répertorié qu'une seule fois.
@products = @user.products.ranked(:limit => 10).uniq!
fonctionne lorsqu'il existe plusieurs enregistrements de commande pour un produit, mais génère une erreur si un produit n'a été commandé qu'une seule fois. (le classement est une fonction de tri personnalisée définie ailleurs)
Une autre alternative est:
@products = @user.products.ranked(:limit => 10, :select => "DISTINCT(ID)")
Je ne suis pas convaincu que je suis sur la bonne approche ici.
Quelqu'un d'autre s'est-il attaqué à cela? Quels problèmes avez-vous rencontrés? Où puis-je en savoir plus sur la différence entre .unique! et DISTINCT ()?
Quelle est la meilleure façon de générer une liste d'enregistrements uniques via une relation has_many, through?
Merci