我现在正在做一个关于 ruby on rails 的项目。我创建了一个名为 product 的实体,我想设置与其他名为 category 的实体的多对多关系。
script/generate scaffold product prd_name:string category:references
通过执行此代码,只能进行一对一映射。如何在没有硬编码的情况下设置多对多?
我现在正在做一个关于 ruby on rails 的项目。我创建了一个名为 product 的实体,我想设置与其他名为 category 的实体的多对多关系。
script/generate scaffold product prd_name:string category:references
通过执行此代码,只能进行一对一映射。如何在没有硬编码的情况下设置多对多?
您不应该期望能够仅通过脚手架生成您的应用程序。它只是为了提供一个入门示例。
rails 中最灵活的多对多关系称为has many through。这需要一个连接表,在这种情况下通常称为“分类”。它需要一个product_id
声明为的列belongs to :product
和一个category_id
声明为的列belongs_to :category
。三个模型(包括连接模型)将这样声明:
# Table name: products
# Columns:
# name:string
class Product < ActiveRecord::Base
has_many :categorisations, dependent: :destroy
has_many :categories, through: :categorisations
end
# Table name: categories
# Columns:
# name:string
class Category < ActiveRecord::Base
has_many :categorisations, dependent: :destroy
has_many :products, through: :categorisations
end
# Table name: categorisations
# Columns:
# product_id:integer
# category_id:integer
class Categorisation < ActiveRecord::Base
belongs_to :product
belongs_to :category
end
请注意,我已经命名了列name
,而不是prd_name
因为这既是人类可读的,又避免了表名的冗余重复。强烈建议在使用导轨时这样做。
可以像这样生成模型:
rails generate model product name
rails generate model category name
rails generate model categorisation product:references category:references
至于生成脚手架,您可以在前两个命令中model
替换为。scaffold
不过,我不推荐它,除非作为查看示例以学习的方式。
可以使用这样的命令生成带有参考的模型
$ rails generate model Comment commenter:string body:text post:references
请参阅http://guides.rubyonrails.org/getting_started.html#generating-a-model
现在可以使用这样的命令生成带有引用的脚手架
$ rails generate scaffold Comment commenter:string body:text post:references
我们不能通过脚手架来做到这一点。我们必须编辑类的模型来设置多对多关系。