我又回到了一个我自己没有解决的问题。我有一个
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
如果我理解正确的话,您想在发货中添加始发地和目的地地址,对吗?
在这种情况下:
如果您想创建迁移来创建关系
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
我不需要迁移,因为外键已经就位。我尝试的那个不起作用,
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