How to display unique records from a has_many through relationship?

Have you tried to specify the :uniq option on the has_many association:

has_many :products, :through => :orders, :uniq => true

From the Rails documentation:

:uniq

If true, duplicates will be omitted from the collection. Useful in conjunction with :through.

UPDATE FOR RAILS 4:

In Rails 4, has_many :products, :through => :orders, :uniq => true is deprecated. Instead, you should now write has_many :products, -> { distinct }, through: :orders. See the distinct section for has_many: :through relationships on the ActiveRecord Associations documentation for more information. Thanks to Kurt Mueller for pointing this out in his comment.


On Rails 6 I got this to work perfectly:

  has_many :regions, -> { order(:name).distinct }, through: :sites

I couldn't get any of the other answers to work.


Note that uniq: true has been removed from the valid options for has_many as of Rails 4.

In Rails 4 you have to supply a scope to configure this kind of behavior. Scopes can be supplied through lambdas, like so:

has_many :products, -> { uniq }, :through => :orders

The rails guide covers this and other ways you can use scopes to filter your relation's queries, scroll down to section 4.3.3:

http://guides.rubyonrails.org/association_basics.html#has-many-association-reference