2016-11-09 2 views
1

У меня есть прямая связь между прямой 3-х различных моделей:Rails 5 - HAS_ONE: через с: class_name не обеспечивает связанный запись

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 

Любая идея, почему Associat ион сломан?

ответ

0

При указании has_one отношения с class_name (без указания foreign_key), рельсы по соглашению ищет внешний ключ class_name_id на модели class_name.

Итак, has_one :private_car, class_name: 'Car' ищет foreign_key car_id по модели Car, которая не является тем, что вы хотите.


То, что вы хотите, это

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 

с внешними ключами private_car_id и company_car_id, определенных на модели Car

Смежные вопросы