【问题标题】:Foreign Key Constraint Failing - Rails db migration外键约束失败 - Rails 数据库迁移
【发布时间】:2020-10-30 15:12:00
【问题描述】:

我的 rails 航班预订应用程序有 2 个表格 - 一张用于航班,一张用于机场。我正在尝试通过播种来注入飞行和机场数据,并在播种下面的飞行数据时不断收到外键约束错误(rake db:seed)。我尝试使用模型关联,但我不太确定这是否是问题的根源。

表格

Flight(id: integer, start_airport_id: integer, end_airport_id: integer, departure_time: datetime, flight_duration: integer, created_at: datetime, updated_at: datetime)

Airport(id: integer, airport_code: string, created_at: datetime, updated_at: datetime)

种子文件

Airport.delete_all
airports = Airport.create([{ airport_code: 'SFO' }, { airport_code: 'NYC' }, { airport_code: 'LAX' }, 
{ airport_code: 'LAS' }, { airport_code: 'DEN' }, { airport_code: 'SEA' }, {airport_code: 'PHX' }])

Flight.delete_all
flights = Flight.create([{ start_airport_id: 1, end_airport_id: 2, departure_time: DateTime.new(2020, 8, 29, 16, 30, 0), flight_duration: 5 }, 
{ start_airport_id: 1, end_airport_id: 3, departure_time: DateTime.new(2020, 7, 13, 13, 0, 0), flight_duration: 2 }, 
{ start_airport_id: 1, end_airport_id: 4, departure_time: DateTime.new(2020, 9, 7, 9, 30, 0), flight_duration: 2 }, 
{ start_airport_id: 2, end_airport_id: 7, departure_time: DateTime.new(2020, 10, 6, 10, 0, 0), flight_duration: 5 }, 
{ start_airport_id: 1, end_airport_id: 2, departure_time: DateTime.new(2020, 12, 4, 6, 30, 0), flight_duration: 6 }, 
{ start_airport_id: 3, end_airport_id: 2, departure_time: DateTime.new(2020, 11, 4, 11, 0, 0), flight_duration: 6 }])

型号

class Airport < ApplicationRecord
    has_many :departing_flights, class_name: "Flight"
    has_many :arriving_flights, class_name: "Flight"
end

class Flight < ApplicationRecord
    has_many :to_airport, foreign_key: :end_airport_id, class_name: "Airport"
    has_many :from_airport, foreign_key: :start_airport_id, class_name: "Airport"
end

【问题讨论】:

  • 您收到有关start_airport_idend_airport_id 的投诉?你确定你有一个id1 的机场吗?如果您在致电Airport.delete_all 之前有一些机场,则不一定会从id=1 开始创建新机场。因此,您要么必须重置数据库中的一些序列,要么在创建航班时使用机场代码查找机场,而不是假设您知道 ids 是什么。
  • @muistooshort 谢谢!你是对的 - 我以为我确实有机场,我输入了我的 ID,但我重新加载了我的 rails 控制台,发现它们从后面的序列开始,所以我只需要重置序列。感谢您为我指明正确的方向!

标签: ruby-on-rails ruby foreign-keys migration model-associations


【解决方案1】:

解决了!在运行rake db:seed 后调用 Airport.delete_all 删除了我所有的机场实例并创建了新的但不同的 id。我不得不重置数据库中的一些序列,例如@muistooshort 建议在此处使用 active-record-reset-pk-sequence gem [https://github.com/splendeo/activerecord-reset-pk-sequence]。在Airport.delete_all 下方我在安装gem 后添加了Airport.reset_pk_sequence,它工作正常!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2018-01-23
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多