Question

I am trying to set up a Many-to-Many association between 2 objects. I have gone through several tutorials and have been able to correctly set up the model. My problem is that I am having trouble setting up the correct routes so I can view the full relationship... something like only displaying the products from a specific category (/categories/1/products/)

This is how I generated the model:

script/generate scaffold category name:string
script/generate scaffold product name:string
script/generate scaffold categorization category_id:integer product_id:integer

Here is the schema:

ActiveRecord::Schema.define(:version => 20100205210519) do

  create_table "categories", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "categorizations", :force => true do |t|
    t.integer  "category_id"
    t.integer  "product_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "products", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end

Here is the 3 model objects:

class Category < ActiveRecord::Base
    has_many :categorizations
    has_many :products, :through => :categorizations
end

class Product < ActiveRecord::Base
    has_many :categorizations
    has_many :categories, :through => :categorizations
end

class Categorization < ActiveRecord::Base
    belongs_to :product
    belongs_to :category
end

Pretty simple and everything seems to be working fine because I can add a product to a category through the console:

@category.categorizations << Categorization.new(:product_id => 1)

I'm sure I need to update the routes.rb file but I don't really know the correct way to do it. This is what I put in the routes file:

map.resources :categories, :has_many => :products

When I try to view products on a category "/categories/7/products/" it just lists all of the products! Does this mean my route is set up correctly and I just need to write a custom action on the products controller (instead of it going to index)? What am I doing wrong here... am I close or way off?!?

Thanks

Was it helpful?

Solution

You're probably not using the data from the route to filter your list of products.

In your index method of the product_controller, you need to do something like:

Category.find(params[:category_id]).products

OTHER TIPS

What you want to do is use nested resources. The general format looks like this:

map.resources :users do |users|
  users.resources :posts
end

Read more about it here.

As proposed in this question, you could try adding the request parameter :category_id to your find query.

Always look at the output of rake routes.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top