在回调函数中获取ActiveRecord关联ID

时间:2011-09-02 14:26:48

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有两个相关的模型,员工和医生:

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

class Doctor < ActiveRecord::Base
  belongs_to :employee
end

当医生已经创建并保存时 我希望能够访问员工after_save回调中的医生ID:

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 :(得分:0)

你的Doctor模型是否有id访问器?

尝试使用doctor_id代替doctor.id,减少一个数据库查询:)

答案 1 :(得分:0)

我发现了我的错误所在:

我在Employee

中有一个糟糕的访问者
class Employee < ActiveRecord::Base
  ...
  def is_doctor= val
    create_doctor if val == '1'
  end
  ...
end

它试图创建一名新医生,但它在更新操作时出错。在那之后,'self'-object中的医生id属性是空的。

解决方案是将关联操作置于另一个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