Named scopee on an association table

Hi,

I have a Category and a Model product with an association table
categories_products.

I want a named that returns the categories with products.
Here is what I've done (in the Category model):

named_scope :with_products, lambda {
    {
      :joins => "inner join categories_products on (categories.id =
categories_products.category_id)"

    }}

The problem with this named_scopes is that it returns X number of the
time the same category. (X is the number of products that the category
as)

What in my named scope I have to add to avoid this?

Greg

Assuming that you have defined has_and_belongs_to relationships
between the classes (or has_many through if that is what you prefer)
then if you have a category you can use @category.products to give you
and array of products for that category, there is no need for a named
scope. Such is the magic of Rails.

Colin

Colin Law wrote:

I thought you meant "categories (along) with (their) products".
Do you mean that you want all the categories that have at least one
product, ie where category.products.count > 0?

Colin

Colin Law wrote:

Greg Ma wrote:

Colin Law wrote:

Colin

Yes I know that but I'm not trying to get Products but Categories with
products

I thought you meant "categories (along) with (their) products".
Do you mean that you want all the categories that have at least one
product, ie where category.products.count > 0?

Colin

That doesnt work either, that tells you if the current category has more
than one products.
And I want all the categories which has at least one product.

named_scope :with_products, lambda {
    {
      :select => "distinct categories.id",
      :joins => "inner join categories_products on (categories.id =
categories_products.category_id)"
    }}

It should be something like that, but this returns the categories id who
has products, and I want the ActiveRecord object not the ids...

I did not say that is the solution, I asked whether you were trying to
find all categories that meet that condition, to which I think the
answer is yes.

I suggest getting it working in a find first, then convert it to a
named scope. You could use something like
Category.find( :all, :include => :products ).select { |c| c.products.count > 0 }

Colin