我按照教程制作一个简单的多对多示例, http://hadiyahdotme.wordpress.com/2011/09/25/many-ways-to-do-many-to-many-hacker-notes/
我以为我们只需要创建另一个表“分类”来使类别和产品模型之间的多对多关系就足够了!我们为什么要这样做'rails generate migration create_categories_products_join'
看不懂,有什么办法可以帮到我,万分感谢!
我按照教程制作一个简单的多对多示例, http://hadiyahdotme.wordpress.com/2011/09/25/many-ways-to-do-many-to-many-hacker-notes/
我以为我们只需要创建另一个表“分类”来使类别和产品模型之间的多对多关系就足够了!我们为什么要这样做'rails generate migration create_categories_products_join'
看不懂,有什么办法可以帮到我,万分感谢!
类别和产品之间必须是关联(连接),因此您必须为此创建特殊表。
如果你想使用 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
它只是两个例子。第一个是关于has_and_belongs_to_many
第二个是关于has_many :through
。
如果您要使用has_many :through
和categorization
表,则无需创建另一个表categories_products
。
选择其中一种方法,您就完成了。我会推荐has_many :through
。它更灵活。
当您拥有拥有和属于许多(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
为什么我们需要模型之间的关联?因为它们使您的代码中的常见操作更简单、更容易。
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
现在在 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