1

我按照教程制作一个简单的多对多示例, http://hadiyahdotme.wordpress.com/2011/09/25/many-ways-to-do-many-to-many-hacker-notes/

我以为我们只需要创建另一个表“分类”来使类别和产品模型之间的多对多关系就足够了!我们为什么要这样做'rails generate migration create_categories_products_join'

看不懂,有什么办法可以帮到我,万分感谢!

4

5 回答 5

3

类别和产品之间必须是关联(连接),因此您必须为此创建特殊表。

如果你想使用 has_and_belongs_to_many:

在模型/product.rb 中:

...
has_and_belongs_to_many :categories, :join_table => :categories_products
...

在模型/category.rb 中:

...
has_and_belongs_to_many :products, :join_table => :categories_products
...

在您的迁移文件中 create_categories_products_join.rb

...
create_table :categories_products, :id => false do |t|
  t.references :product
  t.references :category
end
add_index :categories_products, [:product_id, :category_id]
add_index :categories_products, [:category_id, :product_id]
...

并删除分类模型rails d model categorization

如果你想使用 has_many :through

在模型/product.rb 中:

...
has_many :categorizations
has_many :categories, :through => :categorizations 
...

在模型/category.rb 中:

...
has_many :categorizations
has_many :products, :through => :categorizations 
...

在模型/分类.rb

...
belongs_to :product
belongs_to :category
...

在迁移文件 create_categorizations

...
create_table :categorizations do |t|
  t.references :product
  t.references :category
  #...
  t.timestamps
end
add_index :categorizations, :category_id
add_index :categorizations, :product_id
...

迁移 create_categories_products_join 可以移除rails d migration create_categories_products_join

于 2013-07-30T07:52:37.283 回答
0

它只是两个例子。第一个是关于has_and_belongs_to_many第二个是关于has_many :through

如果您要使用has_many :throughcategorization表,则无需创建另一个表categories_products

选择其中一种方法,您就完成了。我会推荐has_many :through。它更灵活。

于 2013-07-30T07:07:09.057 回答
0

当您拥有拥有和属于许多(HABTM) 关系时,您必须定义一种将产品连接到类别的方法,反之亦然。因此,您应该使用连接表。

在 Rails 中,当您编写代码时:

has_many :products, through: :categorizations

您应该参考每一个来创建一个连接表分类:

create_table "categorizations" do |t|
  t.integer  "category_id"
  t.integer  "product_id"
end

然后,您可以访问特定产品product.categories的类别和类别中的产品category.products

我建议您观看此RailsCast并查看此代码

于 2013-07-30T07:48:22.837 回答
0

为什么我们需要模型之间的关联?因为它们使您的代码中的常见操作更简单、更容易。

has_many :through 关联通常用于与另一个模型建立多对多连接。该关联表明声明模型可以通过第三个模型与另一个模型的零个或多个实例匹配。

对于多对多,我们需要在您的示例中创建第三个模型 .ie

    create_table "categorizations" do |t|
    t.integer  "category_id"
    t.integer  "product_id"
    end

- - - - - - -楷模 - - - - - - -

   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
于 2013-07-30T10:02:45.983 回答
0

现在在 Rails 4 中创建连接表很酷,请参阅可用的方法 -

迁移到 create_join_table 的方法会创建一个 HABTM 连接表。一个典型的用途是:

create_join_table :products, :categories

当你想自定义表名时,你可以传递选项 :table_name 。例如:

create_join_table :products, :categories, table_name: :categorization

将创建一个分类表。

create_join_table 还接受一个块,您可以使用它来添加索引(默认情况下不创建)或其他列:

create_join_table :products, :categories do |t|
  t.index :product_id
  t.index :category_id
end

点击这里查看更多详情

于 2015-10-01T11:43:22.427 回答