【问题标题】:How to write associations for a model with two foreign keys for the same relationship?如何为具有相同关系的两个外键的模型编写关联?
【发布时间】:2020-09-13 09:48:40
【问题描述】:

我又遇到了一个我自己还没有解决的问题。我有一个shipments 表,其中addresses 有两列,即to_address_idfrom_address_id

看了一个相关的问题(Same Model for Two belongs_to Associations migration),我还是一头雾水。这是我到目前为止的工作。我还没有运行迁移。在为此烦恼并浪费一两个小时之前,我正试图在脑海中解决这个问题。非常感谢您的帮助。

class AddAddressFromAndAddressToToAddress < ActiveRecord::Migration[6.0]
  def change
    add_reference :address, :address_from, null: false
    add_reference :address, :address_to, null: false
    add_foreign_key :address, :shipments, column: :to_address_id
    add_foreign_key :address, :shipments, column: :from_address_id
  end
en

【问题讨论】:

    标签: ruby-on-rails postgresql foreign-keys rails-migrations


    【解决方案1】:

    如果我理解正确,您想在运输中添加出发地和目的地地址,对吗?

    在这种情况下:

    如果要创建迁移来创建关系

    class AddOriginAndDestinyAddressToShipment < ActiveRecord::Migration[6.0]
      def change
        add_reference :shipments, :from_address, foreign_key: { to_table: :addresses }
        add_reference :shipments, :to_address, foreign_key: { to_table: :addresses }
      end
    end
    
    

    如果你想创建一个有关系的模型

    class CreateShipments < ActiveRecord::Migration[6.0]
      def change
        create_table :shipments do |t|
          t.datetime :deadline
          t.references :from_address, null: false, foreign_key: { to_table: :addresses }
          t.references :to_address, null: false, foreign_key: { to_table: :addresses }
          t.timestamps
        end
      end
    end
    

    并且模型Shipment必须是这样的

    class Shipment < ApplicationRecord
      belongs_to :to_address, class_name: 'Address'
      belongs_to :from_address, class_name: 'Address'
    end
    

    【讨论】:

      【解决方案2】:

      我不需要迁移,因为外键已经到位。我试过的那个没有用,strong_migrations gem 在抱怨。我只需要正确接线即可。

      我想展示我节省了一些混乱的方法,所以我可以输入 shipment.to_addressshipment.address_to 并获得相同的结果。谢谢。

      class Shipment < ApplicationRecord
        belongs_to :address_from, class_name: 'Address', foreign_key: :from_address_id
        belongs_to :from_address, class_name: 'Address', foreign_key: :from_address_id
        belongs_to :address_to,   class_name: 'Address', foreign_key: :to_address_id
        belongs_to :to_address,   class_name: 'Address', foreign_key: :to_address_id
      end
      
      class Address < ApplicationRecord
        has_many :shipments
      end
      

      【讨论】:

        猜你喜欢
        • 2015-12-04
        • 1970-01-01
        • 1970-01-01
        • 2018-07-05
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多