2014-01-22 2 views
-2

Есть две модели A, B так:У странных спутанных ассоциаций ActiveRecord has_one?

class A < ActiveRecord::Base 
     has_one :b,:foreign_key => :sid 
    end 

    class B < ActiveRecord::Base 
     belongs_to :a,:foreign_key => :sid 
    end 

A имеет поле id который auto_increment, подал sid, которые Uniq

B подал sid, что я установить в primary_key

Теперь я хочу получить b экземпляр через a экземпляр. мой следующий код:

A.frist.b 

я получил ошибку

SELECT `b_model_name`.* FROM `b_model_name` WHERE `b_model_name`.`sid` = 1 LIMIT 1 

внимания в модели базы данных B есть запись, которая модель ассоциации A сначала sid

я хочу знать, почему запрос понравится

SELECT `b_model_name`.* FROM `b_model_name` WHERE `b_model_name`.`sid` = 1 LIMIT 1 

почему нет:

SELECT `b_model_name`.* FROM `b_model_name` WHERE `b_model_name`.`sid` = a.sid LIMIT 1 

ответ

2

Ваш код выглядит хорошо для меня

Одна из причин ты downvoted, я думаю, что вы собираетесь против конвенции путем определения пользовательских foreign_key для стандартного has_one/belongs_to отношений

И, кроме того, я не вижу, чего вы на самом деле пытаетесь достичь! Если модели были совершенно разные, вы должны определить собственное отношение, но это выглядит, как будто они стандарт высокого has_one/belongs_to отношения

Может быть, вы могли бы попробовать это:

class A < ActiveRecord::Base 
     has_one :b, class_name: "B" 
    end 

    class B < ActiveRecord::Base 
     belongs_to :a, class_name: "A" 
    end 

    as 
    id | a1 | a2 | a3 | a4 | created_at | updated_at 

    bs 
    id | a_id | b1 | b2 | b3 | created_at | updated_at 
Смежные вопросы