Получил действительно интересную ситуацию со всеми отношениями has_one
и belongs_to
, когда Rails загружает свои зависимые модели обратным образом.Mutiple has_one того же класса
Давайте модель Couple
с двумя родственными моделями того же класса, User
:
class Couple < ActiveRecord::Base
has_one :male, class_name: "User"
has_one :female, class_name: "User"
end
class User < ActiveRecord::Base
belongs_to :couple
end
В этой ситуации, когда мы создаем Couple
и присвоить ему два экземпляра User
, мы получим в этом :
# create all the stuff
couple = Couple.new
he = User.create name: 'Bob'
she = User.create name: 'Sara'
couple.male = he
couple.female = she
couple.save
# here's where the gap begins:
couple.male.name # => 'Bob'
couple.female.name # => 'Sara'
# Ok, so far so good...
Couple.find(couple.id).male.name # => 'Bob'
# What's the ..?!
Couple.find(couple.id).female.name # => 'Bob'
И то, что я видел в консоли исполняющей все это, заключается в следующем:
> couple.female.name
'Sara'
# nothing happens as the model is loaded already
> Couple.find(couple.id).female.name
SELECT `couples`.* FROM `couples` WHERE `couples`.`id` = 2 LIMIT 1
SELECT `users`.* FROM `users` WHERE `users`.`couple_id` = 2 LIMIT 1
'Bob'
# sure, here's the trouble!
Хммм ... Это нехорошо ... Поиск через Интернет привел меня к следующему: я создал два класса: MaleUser
и FemaleUser
, оба из User
. И изменил belongs_to :couple
на belongs_to :couple, foreign_key: :his_id
и ... :her_id
. Тем не менее, тот же результат я видел на экране.
Мой вопрос: почему, черт возьми, это происходит и как правильно выполнять эту загрузку? Так что Couple.find(couple_id).she
дал бы мне подходящий объект? Структура таблицы::
UPD
create_table :users do |t|
t.integer :couple_id
# ...
end
create_table :couples do |t|
t.integer :his_id
t.integer :her_id
# ...
end
Спасибо!
Не могли бы вы также включить структуру таблиц миграции/SQL-таблицы для 'User' и' Couple'? – Pete
@ Пойдем, если это поможет ... Тем не менее, нет ничего действительно интересного или сверхъестественного ... – shybovycha