【问题标题】:how to update database schema after running migrations in ruby on rails如何在 ruby​​ on rails 中运行迁移后更新数据库模式
【发布时间】:2019-03-01 01:23:17
【问题描述】:

我从 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 进入数据库,迁移并没有在 citiesstreets 表之间生成关系。 streets 表向我显示了一个 city_id 字段,但在 ER 图表视图中仍未显示任何关系。

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

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

【问题讨论】:

    标签: ruby-on-rails ruby database-migration


    【解决方案1】:

    add_reference 迁移命令将在您的streets 表中添加一个city_id 列。

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

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

    【讨论】:

    • 换句话说:应用程序将维护引用身份而不是数据库?
    • 两者兼而有之。 add_reference 迁移命令中的 foreign_key: true 行告诉底层数据库它正在添加的列应该被视为外键。
    • 不能使用段落总是让我陷入 SO cmets...) ActiveRecord 将尽最大努力确保完整性 - belongs_to 关系默认情况下经过验证,除非您指定 @987654333,否则无法取消@ 当您在模型中定义关系时。您可能还需要确保您在 has_many 声明中正确拼写了 dependent: :destroy,否则 ActiveRecord 将默默地忽略它。如果 Rails 是您进入数据库的唯一途径,那么对于小型项目来说,这通常“足够好”。
    • 为了安全起见,创建引用列的迁移命令的foreign_key: true 子句应该告诉数据库强制执行其自身的限制,以确保streets.city_id 中的所有值都有效(有关SQLite site 的更多信息)。如果其他应用程序可能正在创建数据,这将特别有用。
    • 如果迁移不会在数据库中创建关系,那么每个表都将是一个孤独的实体
    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2010-12-31
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多