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

Colin L. wrote:

On 13 July 2010 09:26, Greg Ma [email protected] wrote:

� � �:joins => "inner join categories_products on (categories.id =

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

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

On 13 July 2010 09:26, Greg Ma [email protected] wrote:

 :joins => "inner join categories_products on (categories.id =

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

On 13 July 2010 10:36, Greg Ma [email protected] 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

Colin L. wrote:

On 13 July 2010 10:36, Greg Ma [email protected] 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.

Greg Ma wrote:

Colin L. wrote:

On 13 July 2010 10:36, Greg Ma [email protected] 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…

On 13 July 2010 13:03, Greg Ma [email protected] wrote:

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.

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