Rails 5.0:添加引用现有表的自连接表

时间:2018-11-14 20:08:08

标签: ruby-on-rails migration self-join

我们正在创建一个航班调度程序,该程序可以调度员工和飞机的航班。

以下是当前存在的模型 飞机场 飞行员 空姐 飞机

我们仅从四个机场开始。我们希望在应用启动后立即在“机场”表中填写四个机场,然后从“机场”中创建一个自联接表,其中列出了所有可能的始发地-目的地组合及其持续时间。

我们将如何做?

我在网上看到了一些有关它的资料,但是当我们创建模型时,看起来好像已经完成了,但是我们的模型已经制作好了,所以我无法弄清楚迁移以及如何自动填写该表。我们知道持续时间,只需要输入它们即可。

编辑:

根据飞行时间:我们计划将它们存储为整数,即完成飞行所需的分钟数。这些机场是在中部时区随机选择的中西部城市。

林肯和爱荷华城:32分钟

林肯和埃文斯顿:57分钟

林肯和西拉斐特:62分钟

爱荷华城和埃文斯顿:24分钟

爱荷华城和西拉斐特:31分钟

埃文斯顿和西拉斐特:13分钟

更多详情

这是创建了Airports表的特定迁移

NULL

full_name就是像Evanston这样的名称。 flight_code是代表它的三个字母代码,例如EVA。 该模型当前为空。在添加关联列之前,是否需要先在其中添加一些内容?还是需要生成迁移以创建联接表,然后更改机场模型?

1 个答案:

答案 0 :(得分:0)

您可以在迁移后运行ruby代码,在这种情况下,可以运行Rails代码:

class CreateAirports < ActiveRecord::Migration[5.2]
  def change
    create_table :airports do |t|
      t.string :full_name
      t.string :flight_code

      t.timestamps
    end

    Airport.create(params_for_airport1)
    Airport.create(params_for_airport2)
    Airport.create(params_for_airport3)
    Airport.create(params_for_airport4)
  end
end

然后,对于工期表,我想您将使用一个包含3列的表来获得“ FlightDuration”之类的东西:airport_from_idairport_to_idduration。您可以执行与之前相同的操作,创建表,然后在create_table之后创建带有数据的对象。

您必须将关系添加到Airport和FlightDuration,类似:

class Airport < ApplicationRecord
  has_many :flight_durations_from, class_name: 'FlightDuration', inverse_of: :airport_from
  has_many :flight_durations_to, class_name: 'FlightDuration', inverse_of: :airport_to
end

class FlightDuration < ApplicationRecord
  belongs_to :airport_from, class_name: 'Airport', foreign_key: :airport_from_id
  belongs_to :airport_to, class_name: 'Airport', foreign_key: :airport_to_id
end