Ruby on rails 何时分配外键以及何时仅创建关联?

Ruby on rails 何时分配外键以及何时仅创建关联?,ruby-on-rails,model,Ruby On Rails,Model,我正在学习rails中的模型关联。我已经学习了如何为模型的表指定一列来保存另一个模型的外键,如下所示: rails generate model User account_id:integer has_one :account 然后,我将从account表中获取帐户的主键,并将其分配给指定用户的account\u id 但是,我也被告知在User.rb中创建关联,如下所示: rails generate model User account_id:integer has_one :ac

我正在学习rails中的模型关联。我已经学习了如何为模型的表指定一列来保存另一个模型的外键,如下所示:

rails generate model User account_id:integer 
has_one :account
然后,我将从
account
表中获取帐户的主键,并将其分配给指定用户的
account\u id

但是,我也被告知在
User.rb中创建关联,如下所示:

rails generate model User account_id:integer 
has_one :account
我理解这两件事之间的区别。一个在表中创建一列(迁移后的第一行),另一个生成一系列帮助程序(后者)

然而,我在教程中看到的是,有时两者都完成了,而其他时候,只有关联(
有一个:account
)完成了。我如何决定何时在表中创建一列来保存外键,以及何时仅在model.rb文件中创建关联

  • 您必须始终在数据库中创建列(1)
  • 定义模型内部的关系不是强制性的,但强烈建议(2)
(1) :数据库需要此列外键才能检索相应的记录。如果没有该列,DB将无法找到相关记录。可以使用创建此柱,而不仅仅是脚手架

(2) :您可以跳过模型中的关系声明,但强烈建议您这样做,因为:

  • 它生成与关系对应的方法(例如:
    用户所属\角色
    ,然后您可以直接执行
    用户.角色
    ,而不是
    角色.其中(id:User.role\u id).首先
  • 不是每个人都能记住所有的联想。最好显示/列出链接到模型的所有内容

你问:

我如何决定何时在表中创建一列来保存外键,以及何时仅在model.rb文件中创建关联

我会回答:

始终创建列(如果不创建,则无法工作)并定义模型中的每个关联(关系)

  • 您必须始终在数据库中创建列(1)
  • 定义模型内部的关系不是强制性的,但强烈建议(2)
(1) :数据库需要此列外键才能检索相应的记录。如果没有该列,DB将无法找到相关记录。可以使用创建此柱,而不仅仅是脚手架

(2) :您可以跳过模型中的关系声明,但强烈建议您这样做,因为:

  • 它生成与关系对应的方法(例如:
    用户所属\角色
    ,然后您可以直接执行
    用户.角色
    ,而不是
    角色.其中(id:User.role\u id).首先
  • 不是每个人都能记住所有的联想。最好显示/列出链接到模型的所有内容

你问:

我如何决定何时在表中创建一列来保存外键,以及何时仅在model.rb文件中创建关联

我会回答:

始终创建列(如果不创建,则无法工作)并定义模型中的每个关联(关系)

  • 第一个示例是创建模型文件和迁移的脚手架
  • has_one
    帮助ActiveRecord了解表之间的关系,以便它能够为您生成正确的SQL查询
  • 但是#1必须到位#2才能正常工作。然而,通过scaffold命令创建db列并不是必需的——它只是有时候很方便,因为它同时创建了模型文件和相关的迁移

    您可以手工编写迁移。仅仅因为你所关注的事情并不总是提到添加db列并不意味着它是不必要的。可能只是假设您已经完成了迁移,因为这些外键迁移在您使用Rails启动并运行之后非常常见,以至于在一段时间后,它们就不用说了

  • 第一个示例是创建模型文件和迁移的脚手架
  • has_one
    帮助ActiveRecord了解表之间的关系,以便它能够为您生成正确的SQL查询
  • 但是#1必须到位#2才能正常工作。然而,通过scaffold命令创建db列并不是必需的——它只是有时候很方便,因为它同时创建了模型文件和相关的迁移


    您可以手工编写迁移。仅仅因为你所关注的事情并不总是提到添加db列并不意味着它是不必要的。可能只是假设您已经这样做了,因为这些外键迁移在您使用Rails启动并运行之后非常常见,以至于过了一段时间后它们就不用说了。

    回答得很好。非常感谢。不过有一个问题。当您说“您可以使用迁移来创建此列,而不仅仅是脚手架”时,您的意思是创建实际的迁移文件并编写创建列的代码吗?是的,它可以通过rails generate命令实现:
    rails generate migration add_account_id_to_users
    ,它将生成一个名为
    \u add_account_id_to_users
    的文件,该文件位于
    db/migration/
    ,需要通过命令
    rake db:migrate
    执行。非常感谢。不过有一个问题。当您说“您可以使用迁移来创建此列,而不仅仅是一个脚手架”时,您的意思是创建一个实际的迁移文件并编写创建此列的代码吗?是的,可以通过rails生成命令来实现:
    rails生成迁移将帐户id添加到用户
    并生成一个名为的文件