我有一个多态连接表,我想使用以下迁移来创建它。
create_table :sourceables do |t|
t.string :object_type, null: false
t.bigint :object_id, null: false
t.string :source_type, null: false
t.string :source_id, null: false
end
Sourceable 模型的实例有一个对象和一个源。源关系很像子/父关系。例如,id 为 1 的人有 id 为 2 和 3 的父母。
{object_type: Person, object_id: 1, source_type: Person, source_id: 2}
{object_type: Person, object_id: 1, source_type: Person, source_id: 3}
我不完全理解Rails 多态性指南。看起来数据库列位于对象表上,而不是连接表上。
我想知道的是,如何在 person 模型和 sourceable 模型中建立关联,这样我就可以做类似 person.sources 的事情来获取孩子的所有父母。
我将表名称从 sourceables 更改为parent_child_relationships。
create_table :parent_child_relationships do |t|
t.string :parent_type, null: false
t.bigint :parent_id, null: false
t.string :child_type, null: false
t.bigint :child_id, null: false
end
在模型 ApInvoice 中,我有:
class ApInvoice < ApplicationRecord
has_many :parent_relationships, class_name: "ParentChildRelationship", as: :parent, foreign_key: :child_id
has_many :parent_ap_invoices, through: :parent_relationships, source: :parent, source_type: "ApInvoice"
has_many :child_relationships, class_name: "ParentChildRelationship", as: :child, foreign_key: :parent_id
has_many :child_ap_invoices, through: :child_relationships, source: :child, source_type: "ApInvoice"
end
目前,每张 ap 发票只有一个父级。我正在将其更改为多对多关系。
为了测试我的代码,我做了:
ap_invoice.parent_ap_invoices.first.child_ap_invoices.first.id
由于这张 ap 发票只有一个父级,而父级只有一个子级,因此 ap 发票的 id 应与父级的子级 id 相匹配。