2012-06-12 4 views
1

Я пытался найти self join example в руководстве по направляющим. Я добавил в таблицу поле «manager_id».Rails ассоциация не автоматически сохраняется

Проблема заключается в том, что после объединения двух объектов она не отражается, пока я не назову «сохранить».

Я тестировал его с помощью консоли в режиме разработки:

> boss, emp = 2.times.map { FactoryGirl.create :employee } 
> emp.manager = boss 
> emp.manager_id == boss.id 
=> true 
> boss.subordinates 
=> [] 

Если я теперь сохранить «эй», я получаю желаемый результат.

> emp.save 
> boss.subordinates 
=> [#Employee obj] 

Почему это так? Должен ли я использовать тот же подход для написания тестовых примеров? Почему-то я чувствую, что делаю это неправильно, и должен быть лучший способ.

ответ

1

В вашем первом примере кода вашему экземпляру emp был назначен менеджер, но ваш объект boss не имеет подчиненных и в базе данных еще нет.

До тех пор, пока вы не наберете emp, ActiveRecord не будет знать, что вы добавили босса в качестве менеджера другому объекту. Когда вы вызываете save, запись будет сохранена в базе данных.

Нет ничего плохого в сохранении записи в базе данных для тестовых скриптов, если у вас есть сценарий очистки, который удалит ненужные записи после их создания. Это также проверит проверку и ассоциации вашей модели.

+0

Спасибо за четкое объяснение. –

1

Когда вы звоните boss.subordinates, ROR сделать запрос SQL, как это:

Select * from subordinates where subordinates.id = #{id} 

В вашем случае нет записи в базе данных для подчиненных, и вы ничего не получите.

Вы должны сохранить запись в базе данных, чтобы сделать работу ассоциации.

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