Правильная маршрутизация для :has_many :through
-
18-09-2019 - |
Вопрос
Я пытаюсь установить связь «многие-ко-многим» между двумя объектами.Я прошел несколько уроков и смог правильно настроить модель.Моя проблема в том, что у меня возникли проблемы с настройкой правильных маршрутов, чтобы я мог просмотреть полную взаимосвязь...что-то вроде отображения продуктов только из определенной категории (/категории/1/продукты/)
Вот как я сгенерировал модель:
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)
Я уверен, что мне нужно обновить файл router.rb, но я не знаю, как это сделать правильно.Вот что я поместил в файл маршрутов:
map.resources :categories, :has_many => :products
Когда я пытаюсь просмотреть продукты в категории «/categories/7/products/», там просто перечисляются все продукты!Означает ли это, что мой маршрут настроен правильно, и мне просто нужно написать специальное действие для контроллера продуктов (вместо того, чтобы оно индексировалось)?Что я здесь делаю не так...я близко или далеко?!?
Спасибо
Решение
Вероятно, вы не используете данные маршрута для фильтрации списка продуктов.
В вашем индексном методе product_controller вам нужно сделать что-то вроде:
Category.find(params[:category_id]).products
Другие советы
Что вы хотите сделать, так это использовать вложенные ресурсы.Общий формат выглядит следующим образом:
map.resources :users do |users|
users.resources :posts
end
Подробнее об этом здесь.
Как предложено в этот вопрос, вы можете попробовать добавить параметр запроса :category_id в свой запрос поиска.
Всегда смотрите на вывод грабли маршруты.