使用用户生成模型:引用vs user_id:整数
我很困惑如何生成属于另一个模型的模型。 我的书使用这个语法将Micropost和User相关联:
rails generate model Micropost user_id:integer
但http://guides.rubyonrails.org/说这样做:
rails generate model Micropost user:references
这两个产生的迁移是不同的。 另外,对于前者,rails如何知道user_id
是外键引用user
? 谢谢!
在运行迁移时,两者都会生成相同的列。 在轨道控制台中,您可以看到这种情况:
:001 > Micropost => Micropost(id: integer, user_id: integer, created_at: datetime, updated_at: datetime)
第二个命令在您的Micropost模型中添加一个belongs_to :user
关系,而第一个命令不会。 当这个关系被指定时,ActiveRecord将假定外键保存在user_id
列中,并且将使用名为User
的模型来实例化特定用户。
第二个命令还在新的user_id
列上添加一个索引。
rails如何知道
user_id
是外键引用user
?
Rails本身并不知道user_id
是一个外键引用user
。 在第一个命令栏中rails generate model Micropost user_id:integer
它只添加一列user_id
但是rails不知道使用col。 您需要手动将一行放在Micropost
模型中
class Micropost < ActiveRecord::Base belongs_to :user end class User < ActiveRecord::Base has_many :microposts end
关键字belongs_to
和has_many
确定这些模型之间的关系,并将user_id
声明为User
模型的外键。
后面的命令rails generate model Micropost user:references
在Micropost
模型中添加行belongs_to :user
,并在此声明为外键。
FYI
使用前一种方法声明外键只能让Rails知道模型/表之间的关系。 数据库关于这个关系是未知的。 因此,当你使用MySql Workbench
这样的软件生成EER图时,你会发现模型之间没有任何关系。 像在下面的图片
但是,如果使用后面的方法,则会发现您的迁移文件如下所示:
def change create_table :microposts do |t| t.references :user, index: true t.timestamps null: false end add_foreign_key :microposts, :users
现在外键被设置在数据库级别。 你可以生成适当的EER
图。
对于前者,约定超过configuration。 Rails默认使用时引用另一个表
belongs_to :something
是寻找something_id
。
references
,或belongs_to
实际上是较新的方式写几个怪癖前者。
重要的是要记住,它不会为你创build外键。 为了做到这一点,你需要明确地使用以下任一设置:
t.references :something, foreign_key: true t.belongs_to :something_else, foreign_key: true
或(注意复数):
add_foreign_key :table_name, :somethings add_foreign_key :table_name, :something_elses`