Rails 一对多关联:在搭建脚手架时定义外键字段?
Rails One-To-Many associations: Defining a foreign key field when scaffolding?
我必须在 Rails 中定义一对多关联。像例如“供应商”和“文章”(一个供应商有很多文章)。
脚手架的时候“文章”中是否需要外键字段“vendor_id:int”?
或者稍后在“供应商”和“文章”的模型class中定义关联是否足够?
表示:“文章”-class 得到一个语句“belongs_to :vendor”,“供应商”-class 得到一个语句“has_many :articles” .
article
table 中没有必要有 foreign_key
,但你应该有。生成脚手架的代码应该如下所示
rails g scaffold article vendor:references field1:datatype field2:datatype ...
它将使用 article
table 的 create
语句生成 rails 迁移。
它将有一个 foreign_key 即 vendor_id
如下所示
class CreateArticles < ActiveRecord::Migration[5.1]
def change
create_table :articles do |t|
t.references :vendor, foreign_key: true
.....other fields
t.timestamps
end
end
end
如果您不想 forign_key
,可以从迁移中删除 foreign_key
belongs_to :vendor
将自动添加到 article
模型中。
有必要吗?不。我们仍然可以在 rails 5 次迁移中使用以下内容:
add_reference :article, :vendor, foreign_key: true
但我们也可以在没有引用的情况下对 'relate' 有一些控制器魔法。唯一的问题是我们仍然需要将关系 ID 存储在某个地方。例如,如果您想要索引没有外键的引用,请在文章的控制器中编写以下内容:
def index
@vendor = Vendor.find(params[:vendor_id]) if params[:vendor_id]
## do stuff with vendor object
end
这是执行此操作的正确方法吗?如果您绝对需要避免使用外键,那么这是实现相同结果的一种方法。您在哪里存储和发送 id 关系的参数取决于开发人员。
我必须在 Rails 中定义一对多关联。像例如“供应商”和“文章”(一个供应商有很多文章)。
脚手架的时候“文章”中是否需要外键字段“vendor_id:int”?
或者稍后在“供应商”和“文章”的模型class中定义关联是否足够?
表示:“文章”-class 得到一个语句“belongs_to :vendor”,“供应商”-class 得到一个语句“has_many :articles” .
article
table 中没有必要有 foreign_key
,但你应该有。生成脚手架的代码应该如下所示
rails g scaffold article vendor:references field1:datatype field2:datatype ...
它将使用 article
table 的 create
语句生成 rails 迁移。
它将有一个 foreign_key 即 vendor_id
如下所示
class CreateArticles < ActiveRecord::Migration[5.1]
def change
create_table :articles do |t|
t.references :vendor, foreign_key: true
.....other fields
t.timestamps
end
end
end
如果您不想 forign_key
,可以从迁移中删除 foreign_key
belongs_to :vendor
将自动添加到 article
模型中。
有必要吗?不。我们仍然可以在 rails 5 次迁移中使用以下内容:
add_reference :article, :vendor, foreign_key: true
但我们也可以在没有引用的情况下对 'relate' 有一些控制器魔法。唯一的问题是我们仍然需要将关系 ID 存储在某个地方。例如,如果您想要索引没有外键的引用,请在文章的控制器中编写以下内容:
def index
@vendor = Vendor.find(params[:vendor_id]) if params[:vendor_id]
## do stuff with vendor object
end
这是执行此操作的正确方法吗?如果您绝对需要避免使用外键,那么这是实现相同结果的一种方法。您在哪里存储和发送 id 关系的参数取决于开发人员。