如何使用用户生成模型:引用vs user_id:integer?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我很困惑如何生成属于另一个模型的模型。我的书使用这种语法将Micropost与用户相关联:

rails generate model Micropost user_id:integer

http://guides.rubyonrails.org/说这样做:

rails generate model Micropost user:references

这两个产生的迁移是不同的。另外,对于前者,Rails如何知道这user_id是一个外键引用user?谢谢!

提问于
用户回答回答于

在运行迁移时,两者都会生成相同的列。在rails控制台中,可以看到情况如此:

:001 > Micropost
=> Micropost(id: integer, user_id: integer, created_at: datetime, updated_at: datetime)

第二个命令belongs_to :user在您的Micropost模型中添加一个关系,而第一个命令不会。当这个关系被指定时,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_tohas_many确定这些模型之间的关系并声明user_idUser模型的外键。

后面的命令rails generate model Micropost user:references添加模型中的行belongs_to :userMicropost并在此声明为外键。

FYI 使用前一种方法声明外键仅让Rails知道模型/表格之间的关系。数据库对这种关系不了解。因此,当使用软件生成EER图时,MySql Workbench会发现模型之间没有绘制任何线程关系。就像在下面的图片中

但是,如果使用后面的方法,则会发现迁移文件如下所示:

def change
    create_table :microposts do |t|
      t.references :user, index: true

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

现在外键被设置在数据库级别。并且可以生成适当的EER图表。

扫码关注云+社区