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 关系的参数取决于开发人员。