Category Listing

Hi there.

I'm relatively new to Ruby on Rails, although not to programming in general.

I'm attempting to make a sort of classified ad system. I'd like to have a list of my categories with the number of ads in that category next to it. For example:

Jobs - Carpenters (1) Jobs - Electricians (10) Jobs - IT (3)

etc.

I've created model, Category, and I've linked it to the Classifieds model, using belongs_to: and has_many: tags.

My problem is that I've listed the categories and counts successfully, but they're repeating. Instead of the above, it looks more like this:

Jobs - Carpenters (1) Jobs - Electricians (10) Jobs - IT (3) Jobs - Electricians (10) Jobs - Electricians (10) Jobs - IT (3)

It's repeating because I've got the loop running in category.rb which is called from the category_list.html.

Here's the code from category.rb:

  def self.count_categories       count(:id, :conditions => {:category_id => i})   end

My question is, how can I set it to display only the categories and their counts without repeating?

Thanks, Brian

i think your problem lies in the way you have arranged your relations. You talk about Classifieds (Advert i assume), Category and Tag. Now that is 2 namespaces for a single advert. Ie: One advert belongs to one category and has many tags...

If we leave the tags alone for the time being, and you want a category object holding many adverts and an advert belonging only to one category, then you would do something like:

===category.rb

class Category < AR::Base   has_many :adverts end

===advert.rb

class Advert < AR::Base   belongs_to :category end

your adverts table needs a column :category_id, :integer

=== views/categories/index.rhtml

<%- for category in @categories- %>    Jobs - <%= category.name.upcase! %> ( <%= category.adverts.size %> ) <%- end -%>

=== controllers/categories_controller.rb

def index   @categories = Category.find(:all) end

that should do it.

For the tags system, you will need to set up a many to many relation 9which can be of 2 types, has_and_belongs_to_many or has_many :through, check this out if you're unaware of them has_many :through - Many-to-many Dance-off! ) where an advert has many tags and a tag has many adverts. then you can do things like:

@tag.adverts @advert.tags

hope it helped

Thanks, that did exactly what I wanted!