Я узнал, где моя ошибка:
У меня был плохой метод доступа в Employee
классе
class Employee < ActiveRecord::Base
...
def is_doctor= val
create_doctor if val == '1'
end
...
end
Он пытался создать нового доктора, но это ошибка при обновлении. После этого атрибут id врачей в объекте self был пуст.
Решение состояло в том, чтобы поместить манипуляции с ассоциациями в другой after_save
обратный вызов:
class Employee < ActiveRecord::Base
has_one :doctor, :dependent => :destroy
after_save :save_roles
after_save :save_picture
...
def is_doctor= val
@doc = true if val == '1'
end
private
def save_roles
if doctor
doctor.destroy unless @doc
else
create_doctor if @doc
end
@doc = nil
end
def save_picture
if doctor
file_name = 'doctor_' + doctor.id.to_s + '.jpg'
...
end
end
end