导轨 |使用嵌套属性作为多态关联的外部类型?

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

在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
以使用嵌套属性的技巧?谢谢!

ruby-on-rails polymorphism ruby-on-rails-6 ruby-on-rails-7
1个回答
0
投票

您的联想与您的描述不符。

主记录(我们称之为 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
© www.soinside.com 2019 - 2024. All rights reserved.