3

我正在尝试以一种有点奇怪的方式使用 Rails 的多态关联,但遇到了问题。

多态表是Address

class Address < ActiveRecord::Base
  belongs_to :addressable, polymorphic: true
end

我的数据库有唯一性约束,因此不能将相同的地址地址关联添加两次。

我还有一个Trip需要两个地址的模型。一个是旅行的起点,另一个是目的地。

class Trip < ActiveRecord::Base
  has_one :origin, as: :addressable, class_name: 'Address'
  has_one :destination, as: :addressable, class_name: 'Address'
end

问题在于,当 Rails 创建与行程相关联的地址时,它使用类名(即“Trip”)来填充该addressable_type列。这意味着,如果我尝试使用起点和终点进行旅行,rails 会尝试添加两行具有相同的addressable_typeaddressable_id。这显然在唯一性约束上失败了。

我可以删除唯一性约束,但最终会得到重复的记录,这会使 Rails 感到困惑,因为它不知道哪条记录是起点,哪条记录是终点。

我真正想做的是指定要用于的字符串addressable_type

class Trip < ActiveRecord::Base
  has_one :origin, as: :addressable, class_name: 'Address', type: 'Trip Origin'
  has_one :destination, as: :addressable, class_name: 'Address', type: 'Trip Destination'
end

那可能吗?是否有其他解决方案或者我需要重新考虑我的数据库架构?

4

1 回答 1

2

我会认为这address不应该belongs_to是一次旅行,因为一个地址可能是多次旅行的起点和/或目的地。如果您有唯一性约束,则尤其如此。外键应该存储在行程中:

class Address < ActiveRecord::Base
  has_many :trips_as_origin, class_name: "Trip", foreign_key: "origin_id"
  has_many :trips_as_destination, class_name: "Trip", foreign_key: "destination_id"
end

class Trip < ActiveRecord::Base
  belongs_to :origin, class_name: "Address"
  belongs_to :destination, class_name "Address"
end

您需要创建一个迁移,将origin_id和添加destination_idTrip.

于 2012-07-17T12:44:00.323 回答