Ruby on rails 使用user\u id:integer vs user:references在Rails中生成模型

Ruby on rails 使用user\u id:integer vs user:references在Rails中生成模型,ruby-on-rails,Ruby On Rails,我对如何生成属于另一个模型的模型感到困惑。我的书使用以下语法将Micropost与用户关联: rails generate model Micropost user_id:integer 但是他说要这样做: rails generate model Micropost user:references 这两种方法生成的迁移是不同的。另外,对于前者,rails如何知道user\u id是引用user的外键?谢谢 当您运行迁移时,两者将生成相同的列。在rails控制台中,您可以看到以下情况: :0

我对如何生成属于另一个模型的模型感到困惑。我的书使用以下语法将Micropost与用户关联:

rails generate model Micropost user_id:integer
但是他说要这样做:

rails generate model Micropost user:references

这两种方法生成的迁移是不同的。另外,对于前者,rails如何知道
user\u id
是引用
user
的外键?谢谢

当您运行迁移时,两者将生成相同的列。在rails控制台中,您可以看到以下情况:

:001 > Micropost
=> Micropost(id: integer, user_id: integer, created_at: datetime, updated_at: datetime)
第二个命令在Micropost模型中添加一个
归属于:user
关系,而第一个命令没有。指定此关系时,ActiveRecord将假定外键保存在
user\u id
列中,并将使用名为
user
的模型来实例化特定用户


第二个命令还在新的
用户id
列上添加索引。

对于前者,约定优先于配置。Rails在引用另一个表时默认为

 belongs_to :something
就是寻找
某个id

引用
,或
属于
实际上是一种新的写作方式,前者没有什么怪癖

重要的是要记住,它不会为您创建外键。为此,您需要使用以下任一方法显式设置:

t.references :something, foreign_key: true
t.belongs_to :something_else, foreign_key: true
或(注意复数形式):

rails如何知道
user\u id
是引用
user
的外键

Rails本身不知道
user\u id
是引用
user
的外键。在第一个命令
rails generate model microspost user\u id:integer
中,它只添加一列
user\u id
,但是rails不知道该列的用法。您需要手动将该行放入
microspost
模型中

class Micropost < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :microposts
end
现在在数据库级别设置外键。您可以生成适当的
EER
图表。

您能解释一下引用不会为您创建外键是什么意思吗。它与直接使用user_id:integer的第一个命令有何不同?它不是,除非您使用的是
:多态
选项(在大多数情况下,这不是一个好主意)。如果您想在ActiveRecord中使用外键,请使用。@Krule Now
add\u foreign\u key
已将其添加到ActiveRecord中。最新的Rails生成器似乎将
add\u foreign\u key
操作替换为
foreign\u key:true
选项添加到
t.references
行,这意味着
index:true
。所以现在是
t.references:user,foreign\u key:true
。目前没有可用的
外键
选项文档,因此这只是我的假设。哦,有一个
:外键
选项,它添加了适当的外键约束。我猜这个选项在创建表时也会这样做。如何将ruby db导出到workbench?你能在这里回答这个问题吗:
add\u foreign\u key:microposts,:users
对Rails有什么影响吗?有可能生成一个引用两个表的模型吗?注意,它不会在另一个模型(user)上添加has\u many关联,我认为使用
:references
会在外键上创建索引,而手动创建列则不会?
class Micropost < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :microposts
end
def change
    create_table :microposts do |t|
      t.references :user, index: true

      t.timestamps null: false
    end
    add_foreign_key :microposts, :users