Pregunta

Estoy intentando configurar una asociación de muchos a muchos entre 2 objetos.He pasado por varios tutoriales y he podido configurar correctamente el modelo.Mi problema es que tengo problemas para configurar las rutas correctas para poder ver la relación completa...algo así como mostrar solo los productos de una categoría específica (/categorías/1/productos/)

Así es como generé el modelo:

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

Aquí está el esquema:

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

Aquí están los 3 objetos modelo:

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

Bastante simple y todo parece funcionar bien porque puedo agregar un producto a una categoría a través de la consola:

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

Estoy seguro de que necesito actualizar el archivo route.rb pero realmente no sé cuál es la forma correcta de hacerlo.Esto es lo que puse en el archivo de rutas:

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

Cuando intento ver productos en una categoría "/categorías/7/productos/", ¡simplemente enumera todos los productos!¿Significa esto que mi ruta está configurada correctamente y solo necesito escribir una acción personalizada en el controlador de productos (en lugar de indexarla)?Qué estoy haciendo mal aquí...¿Estoy cerca o lejos?!?

Gracias

¿Fue útil?

Solución

Usted es probablemente no utilizar los datos de la ruta para filtrar la lista de productos.

En el método del índice de la product_controller, que tiene que hacer algo como:

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

Otros consejos

Lo que se quiere hacer es utilizar los recursos anidados. El formato general es el siguiente:

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

Lea más sobre esto aquí .

Como se propone en esta pregunta, podría intentar agregar el parámetro de solicitud: categoría_id a su consulta de búsqueda.

Mire siempre la salida de rutas de rastrillo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top