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_id
和 child_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 如何查找记录。应该能帮你解决这个问题。
我需要在客户模型中创建 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_id
和 child_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 如何查找记录。应该能帮你解决这个问题。