gpt4 book ai didi

ruby-on-rails - 更改多态关联中的类型标识符

转载 作者:数据小太阳 更新时间:2023-10-29 08:05:16 24 4
gpt4 key购买 nike

我试图以一种稍微奇怪的方式使用 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

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

最佳答案

我会认为 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_iddestination_id 添加到 Trip

关于ruby-on-rails - 更改多态关联中的类型标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11520311/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com