【问题标题】:Rails 5 - has_one :through with :class_name doesn't provide associated recordRails 5 - has_one :through with :class_name 不提供关联记录
【发布时间】:2016-11-09 08:53:58
【问题描述】:

我在 3 个不同的模型之间有一个直接的关联:

class Claim < ApplicationRecord
  has_one :private_car, class_name: 'Car'
  has_one :company_car, class_name: 'Car'
  has_one :user, through: :private_car
end

class Car < ApplicationRecord
  belongs_to :claim
  belongs_to :user
end

class User < ApplicationRecord
  has_many :cars
end

相应的表定义了以下外键:

Claim => ['private_car_id','company_car_id']
Car => ['user_id','claim_id']
User => none

控制台输出如下:

2.3.1 :007 > Claim.first.private_car
  Case Load (0.4ms)  SELECT  "cases".* FROM "claims" WHERE "claims"."deleted_at" IS NULL ORDER BY "claims"."id" ASC LIMIT $1  [["LIMIT", 1]]
  Car Load (0.2ms)  SELECT  "cars".* FROM "cars" WHERE "cars"."deleted_at" IS NULL AND "cars"."claim_id" = $1 LIMIT $2  [["claim_id", 1], ["LIMIT", 1]]
 => nil 
2.3.1 :008 > Claim.first.private_car_id
  Claim Load (0.6ms)  SELECT  "claims".* FROM "claims" WHERE "claims"."deleted_at" IS NULL ORDER BY "claims"."id" ASC LIMIT $1  [["LIMIT", 1]]
 => 1
2.3.1 :009 > Claim.first.user
  Claim Load (0.3ms)  SELECT  "claims".* FROM "claims" WHERE "claims"."deleted_at" IS NULL ORDER BY "claims"."id" ASC LIMIT $1  [["LIMIT", 1]]
  User Load (0.5ms)  SELECT  "users".* FROM "users" INNER JOIN "cars" ON "users"."id" = "cars"."user_id" WHERE "users"."deleted_at" IS NULL AND "cars"."deleted_at" IS NULL AND "cars"."claim_id" = $1 LIMIT $2  [["claim_id", 1], ["LIMIT", 1]]
 => nil 

知道为什么关联被破坏了吗?

【问题讨论】:

    标签: ruby-on-rails activerecord heroku ruby-on-rails-5


    【解决方案1】:

    当您指定has_oneclass_name 的关系时(未指定foreign_key),rails 按照惯例在模型class_name 上查找外键class_name_id

    所以,has_one :private_car, class_name: 'Car' 正在寻找模型 Car 上的 foreign_key car_id,这不是你想要的。


    你想要的是这个

    class Claim < ApplicationRecord
      has_one :private_car, class_name: 'Car', foreign_key: 'private_car_id'
      has_one :company_car, class_name: 'Car', foreign_key: 'company_car_id'
    
      has_one :user, through: :private_car
    end
    

    在模型Car上定义了外键private_car_idcompany_car_id

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      相关资源
      最近更新 更多