如何为具有相同关系的两个外键的模型编写关联?

问题描述 投票:0回答:2

我又回到了一个我自己没有解决的问题。我有一个

shipments
表,其中有两列
addresses
,即
to_address_id
from_address_id

在查看了相关问题(Same Model for Two Been_to Associations 迁移)后,我仍然很困惑。这是我到目前为止的工作。我还没有运行迁移。我试图在头脑中解决这个问题,然后再为此而烦恼并浪费一两个小时。我真的很感谢你的帮助。

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
2个回答
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

模型发货必须是这样的

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

0
投票

我不需要迁移,因为外键已经就位。我尝试的那个不起作用,

strong_migrations
宝石正在抱怨。我只需要将其正确连接即可。

我想展示如何避免一些混乱,因此我可以输入

shipment.to_address
shipment.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
© www.soinside.com 2019 - 2024. All rights reserved.