has_many :through with class_name and foreign_key 不工作

has_many :through with class_name and foreign_key not working

我需要在客户模型中创建 parental 关系,即 child 和 parent 关系。为了存储有关 parent 和 child 的信息,我创建了一个连接 table,即 ParentalRelation。 我的客户模型是:

class Customer < ApplicationRecord
  has_many :parental_relations
  has_many :children, class_name: 'Customer', foreign_key: 'child_id', through: :parental_relations
  has_one :parent, foreign_key: 'parent_id', class_name: 'Customer', through: :parental_relations, source: :parent
end

我的 parental_relation 模型是:

class ParentalRelation < ApplicationRecord
  belongs_to :parent, class_name: 'Customer'
  belongs_to :child, class_name: 'Customer'
end

我正在尝试通过以下方式获取数据:

Customer.first.children

但我没有获取数据。即使有数据也会这样:

Customer::ActiveRecord_Associations_CollectionProxy:0x3fe49a819750

如果有人能帮助我,那将是非常有帮助的。提前谢谢你

鉴于您的模型中有 customer has_one :parent,看起来您正在尝试创建 one-to-many 关系。如果这是正确的,则不需要连接 table。如果您要创建 many-to-many 关系,则只需要连接 table。

要以 one-to-many 的身份执行此操作,请删除 ParentalRelation 模型和 table 并将您的客户 class 更新为如下内容:

class Customer < ApplicationRecord
  belongs_to parent, class_name: "Customer"
  has_many children, class_name: "Customer", foreign_key: :parent_id
end

在此处查看有关创建自连接的指南 table: https://guides.rubyonrails.org/association_basics.html#self-joins

完成后,您应该可以执行以下操作:

Customer.first.children

如果 parent_relation 有列 parent_idchild_id 我觉得应该是

class Customer < ApplicationRecord
  has_many :children_relations, class_name: 'ParentalRelation', foreign_key: 'parent_id'
  has_many :children, class_name: 'Customer', foreign_key: 'parent_id', through: :children_relations, source: :child
  
  has_one :parent_relation, class_name: 'ParentalRelation', foreign_key: 'child_id'
  has_one :parent, foreign_key: 'parent_id', class_name: 'Customer', through: :parent_relation, source: :parent
end

根据你的关系,Rails会执行sqlSELECT "customers".* FROM "customers" INNER JOIN "parental_relations" ON "customers"."id" = "parental_relations"."child_id" WHERE "parental_relations"."customer_id" = LIMIT

但我不知道您的 table 结构。因此,您可以阅读 rails 控制台中的 sql 并了解 Rails 如何查找记录。应该能帮你解决这个问题。