正确路由:has_many:through

时间:2010-02-05 22:18:13

标签: ruby-on-rails routes has-many-through

我正在尝试在两个对象之间建立多对多关联。我已经完成了几个教程,并且能够正确设置模型。我的问题是我无法设置正确的路线,所以我可以查看完整的关系...只显示特定类别的产品( / categories / 1 / products / )< / p>

这是我生成模型的方式:

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)

我确定我需要更新routes.rb文件,但我真的不知道正确的方法。这是我放在路线文件中的内容:

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

当我尝试查看“/ categories / 7 / products /”类别的产品时,它只列出了所有产品!这是否意味着我的路由设置正确,我只需要在产品控制器上编写自定义操作(而不是编写索引)?我在这里做错了什么...我是关闭还是离开?!?

由于

3 个答案:

答案 0 :(得分:3)

您可能没有使用路线中的数据来过滤产品列表。

在product_controller的index方法中,您需要执行以下操作:

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

答案 1 :(得分:2)

您要做的是使用嵌套资源。一般格式如下:

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

详细了解here

答案 2 :(得分:0)

根据this question的建议,您可以尝试将请求参数:category_id添加到查找查询中。

始终查看佣金路线的输出。