如何修复Rails多态关联中关联类匹配错误的问题?
修正多态关联的实现方式
你的问题出在User模型中定义的customer和employee关联没有结合多态类型做过滤,仅通过ID匹配会导致返回任意表中ID匹配的记录。以下是正确的实现方案:
1. 修正User模型关联
class User < ApplicationRecord belongs_to :origin, polymorphic: true # 仅当origin_type为Customer时,才返回关联的Customer记录 has_one :customer, -> { where(users: { origin_type: 'Customer' }) }, foreign_key: :id, primary_key: :origin_id, class_name: "Customer" # 仅当origin_type为Employee时,才返回关联的Employee记录 has_one :employee, -> { where(users: { origin_type: 'Employee' }) }, foreign_key: :id, primary_key: :origin_id, class_name: "Employee" end
2. 修正Customer和Employee模型关联
为了反向关联的准确性,同样需要在反向关联中添加类型过滤:
class Customer < ApplicationRecord has_one :user, -> { where(origin_type: 'Customer') }, class_name: "User", foreign_key: :origin_id end class Employee < ApplicationRecord has_one :user, -> { where(origin_type: 'Employee') }, class_name: "User", foreign_key: :origin_id end
原理说明
- 多态关联依赖
origin_id和origin_type两个字段共同确定关联对象,你之前的关联只使用了origin_id,忽略了类型校验,导致只要ID匹配就返回记录。 - 通过在关联的lambda条件中指定
origin_type,可以确保只有当用户的关联类型与目标模型匹配时,才会返回对应的关联记录,否则返回nil。
测试验证:
user = User.create(origin: Customer.find(1)) user.customer # => #<Customer:0x000000014a78d2c8> user.employee # => nil (符合预期)
内容的提问来源于stack exchange,提问作者Victor Luna
相关产品推荐
相关产品推荐

