Zastanawiam się, jaki jest najlepszy sposób wyświetlania unikalnych rekordów z has_many, poprzez relację w Rails3.
Mam trzy modele:
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
Powiedzmy, że chcę wymienić wszystkie produkty zamówione przez klienta na jego stronie pokazu.
Mogli wielokrotnie zamawiać niektóre produkty, więc używam counter_cache do wyświetlania w kolejności malejącej, na podstawie liczby zamówień.
Ale jeśli zamówili produkt wiele razy, muszę upewnić się, że każdy produkt jest wymieniony tylko raz.
@products = @user.products.ranked(:limit => 10).uniq!
działa, gdy istnieje wiele rekordów zamówień na produkt, ale generuje błąd, jeśli produkt został zamówiony tylko raz. (ranking to niestandardowa funkcja sortowania zdefiniowana w innym miejscu)
Inną alternatywą jest:
@products = @user.products.ranked(:limit => 10, :select => "DISTINCT(ID)")
Nie jestem pewien, czy mam tutaj właściwe podejście.
Czy ktoś jeszcze się tym zajął? Jakie problemy napotkaliście? Gdzie mogę dowiedzieć się więcej o różnicy między .unique! i DISTINCT ()?
Jaki jest najlepszy sposób na wygenerowanie listy unikatowych rekordów za pomocą has_many, poprzez relację?
Dzięki