Rails 5-多个外键属于同一个表 [英] Rails 5 - Multiple Foreign keys belongs to the same table

查看:19
本文介绍了Rails 5-多个外键属于同一个表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个属于LoadingStation模型的订单模型。并且LoadingStation将在Order表中使用两次,因此如下所示:

class CreateLoadingStations < ActiveRecord::Migration[5.0]
  def change
    create_table :loading_stations do |t|
      t.integer :type
      t.string :comp_name1
      t.string :street
      t.string :street_num
      t.string :zip_code
      t.string :city

      t.timestamps
    end
  end
  end



 class CreateOrders < ActiveRecord::Migration[5.0]
      def change
         create_table :orders do |t|
          t.string :status
          t.belongs_to :loading_station, class_name: "LoadingStation", index: true, foreign_key: "loading_station_id"
          t.belongs_to :unloading_station, class_name: "LoadingStation", index: true, foreign_key: "unloading_station_id"

          t.timestamps
        end
      end
    end

当我允许运行rails db:Migrate时,我收到以下错误: ActiveRecord::StatementInvalid:pg::UnfinedTable:Error:关系"UNLOADING_STATIONS"不存在

Mmmmmm,似乎是检测到的CLASS_NAME不正确。两个语句中的class_name应该相同,对吗?

检查装货站型号:

 class LoadingStation < ApplicationRecord
end

好的,我更改CreateOrders迁移:

 t.belongs_to :loading_station, class_name: "LoadingStation", index: true, foreign_key: "unloading_station_id"
现在,当我让Rails db:Migrate运行时,我收到以下错误: ActiveRecord::StatementInvalid:pg::DuplicateObject:Error:关系"Orders"的约束"fk_rails_5294e269cc"已存在

好的,我知道数据库中的外键似乎是相同的,并且数据库拒绝迁移任务。

但是,当我定义谁使用不同的外键名称时,当数据库检测到两个相同的外键名称时,foreign_key:选项有什么意义呢?

附录:

这里是我的订单模型:

class Order < ApplicationRecord
end

最后一个问题

在错误消息的末尾,我希望有两个外键指向同一个表。

推荐答案

我只关注允许您引用装货站表两次的代码

在Rails 5.1或更高版本中,您可以这样做:

迁移

class createOrders < ActiveRecord::Migration
   def change
    create_table(:orders) do |t|
        t.references :loading_station, foreign_key: true
        t.references :unloading_station, foreign_key: { to_table: 'loading_stations' }
    end
  end
end

这将创建字段loading_station_idunloading_station_id,并使数据库级引用loading_stations

型号

class Order < ActiveRecord::Base
  belongs_to :loading_station
  belongs_to :unloading_station, class_name: "LoadingStation"
end

class LoadingStation < ActiveRecord::Base
  has_many :load_orders, class_name: "Order", foreign_key: "loading_station_id"
  has_many :unload_orders, class_name: "Order", foreign_key: "unloading_station_id"
end

这篇关于Rails 5-多个外键属于同一个表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆