在Rails中,我想构建我的模型,以便主记录(让我们称之为
Shipment
)有一个详细记录(基本类型:ShipmentDetail
),它是多态的,这样数据的结构可以根据另一个关联中的嵌套属性(比方说:client.name
)。
ShipmentDetail
类包含一个payload
jsonb类型字段,其中包含客户端特定信息。它可以被子类化,这样我们就可以轻松地提取出客户特定的信息,例如ClientA::ShipmentDetail
,ClientB::ShipmentDetail
等。这样,所有ShipmentDetail实例都存储在数据库中同一个shipment_details
表中.
我遇到麻烦的是弄清楚如何正确配置 Shipment 和 ShipmentDetail 之间的关联。
这是基本的 ShipmentDetail 类:
class ShipmentDetail < ApplicationRecord
self.abstract_class = true
self.table_name = "shipment_details"
has_one :shipment
end
这是我目前尝试对 Shipment 类进行建模的方法:
class Shipment < ApplicationRecord
belongs_to :client, optional: true
belongs_to :details, class_name: :shipment_details, \
polymorphic: true, foreign_key: :id, foreign_type: :client_name, optional: true
end
不幸的是,如果我尝试将某些内容分配给
details
关联,我会收到如下错误:
ActiveModel::MissingAttributeError: can't write unknown attribute `client_name`
请告知我如何正确建模此关联 - 是否有配置
foreign_type
以使用嵌套属性的技巧?谢谢!
您的联想与您的描述不符。
主记录(我们称之为 Shipment)有一个详细记录(基本类型:ShipmentDetail),它是多态的,因此数据结构可以根据另一个关联中的嵌套属性进行更改(假设:client.name)。
所以Shipment 有一个 ShipmentDetail,关联应该是:
class Shipment < ApplicationRecord
has_one :shipment_detail
end
class ShipmentDetail < ApplicationRecord
belongs_to :shipment
belongs_to :client
end
客户特定的货运详细信息可以进行子类化,并且可以提取客户信息:
class ClientAShipmentDetail < ShipmentDetail
def client_data
if payload['client'] == 'clientA'
# return Client A data
end
end
end
class ClientBShipmentDetail < ShipmentDetail
def client_data
if payload['client'] == 'clientB'
# return Client B data
end
end
end