Получение идентификатора ассоциации ActiveRecord в функции обратного вызова - PullRequest
0 голосов
/ 02 сентября 2011

У меня есть две связанные модели: сотрудник и доктор:

class Employee < ActiveRecord::Base
  has_one :doctor, :dependent => :destroy
  ...
end

class Doctor < ActiveRecord::Base
  belongs_to :employee
end

Когда доктор уже создан и сохранен.
Я хочу получить доступ к идентификатору врачей у сотрудников после_сохранительного обратного вызова:

class Employee < ActiveRecord::Base
  ...
  after_save :save_picture
  ...
  private
  def save_picture
    if doctor
      file_name = 'doctor_' + doctor.id.to_s + '.jpg'
      ...
    end
  end
end

Я могу получить доступ к любому методу врача, и любой из них работает нормально, но «id» - возвращает «nil».
Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2011

Я узнал, где моя ошибка:

У меня был плохой метод доступа в 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
0 голосов
/ 02 сентября 2011

У вашей модели Доктора есть идентификатор доступа?

Попробуйте doctor_id вместо doctor.id, на один запрос к базе данных меньше :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...