Ruby on rails 使用user\u id:integer vs user:references在Rails中生成模型
我对如何生成属于另一个模型的模型感到困惑。我的书使用以下语法将Micropost与用户关联: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
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 Nowadd\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