如何在 Ruby on Rails 中运行迁移后更新数据库模式



我从Ruby on Rails开始,我有两个模型:

城市和街道,

这两个模型是独立生成的,它们之间没有任何关系。现在我需要一座城市拥有许多街道,每条街道都属于一个城市。我运行了这个命令:

bin/rails generate migration AddCityRefToStreets city:references

这产生了此迁移:

class AddCityRefToStreets < ActiveRecord::Migration[5.2]
def change
add_reference :streets, :city, foreign_key: true
end
end

然后我跑了bin/rails db:migrate,然后我进入这些模型类并写道:

class City < ApplicationRecord
has_many :streets, dependant: :destroy
end

class Street < ApplicationRecord
belongs_to :city
end

Rails 没有表现出任何抱怨,到目前为止它对我来说效果很好。如果我问@city.streets.length它将返回该@city的正确街道数量。如果我问@street.city它也会返回正确的城市。

问题是,我使用 DBeaver 进入数据库,迁移没有在cities表和streets表之间生成关系。streets表向我显示了一个city_id字段,但在 ER 图视图中仍未显示任何关系。

我的问题是:我在这里错过了什么?这是关联两个独立创建的实体的正确方法吗?

我正在使用Linux Mint 18.3,Rails 5.2.1,Sqlite 3.11.0和DBeaver 5.1。

add_reference迁移命令将向streets表中添加city_id列。

当您调用@city.streets时,它被评估为等效于Street.where(city_id: @city.id)

同样,@street.city将查看存储在city_id列中的 ID,并进行查找 - 相当于City.find(@street.city_id)

最新更新