Правильная маршрутизация для: has_many: through - PullRequest
2 голосов
/ 06 февраля 2010

Я пытаюсь установить связь «многие ко многим» между двумя объектами. Я прошел несколько уроков и смог правильно настроить модель. Моя проблема в том, что у меня возникают проблемы с настройкой правильных маршрутов, чтобы я мог просмотреть полную взаимосвязь ... что-то вроде отображения только товаров из определенной категории ( / category / 1 / products / )

Вот как я сгенерировал модель:

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

Вот схема:

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

Вот 3 модельных объекта:

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

Довольно просто, и кажется, что все работает нормально, потому что я могу добавить продукт в категорию через консоль:

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

Я уверен, что мне нужно обновить файл rout.rb, но я не знаю, как это сделать правильно. Вот что я положил в файл маршрутов:

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

Когда я пытаюсь просмотреть товары в категории "/ Categories / 7 / products /", они просто перечисляют все товары! Означает ли это, что мой маршрут настроен правильно, и мне просто нужно написать настраиваемое действие на контроллере продуктов (вместо того, чтобы его индексировать)? Что я тут не так делаю ... я рядом или далеко?!?

Спасибо

Ответы [ 3 ]

3 голосов
/ 06 февраля 2010

Возможно, вы не используете данные из маршрута для фильтрации списка товаров.

В вашем методе index для product_controller вам нужно сделать что-то вроде:

Category.find(params[:category_id]).products
2 голосов
/ 06 февраля 2010

То, что вы хотите сделать, это использовать вложенные ресурсы. Общий формат выглядит следующим образом:

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

Подробнее об этом здесь .

0 голосов
/ 06 февраля 2010

Как предложено в этом вопросе , вы можете попробовать добавить параметр запроса: category_id в запрос поиска.

Всегда смотрите на вывод рейк-маршрутов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...