inverse_of在after_initialize中不起作用

时间:2013-08-22 08:09:02

标签: ruby-on-rails activerecord

inverse_of似乎在after_initialize回调

中不起作用
class User < ActiveRecord::Base
has_many :faces, :inverse_of => :user
end

class Face < ActiveRecord::Base
  belongs_to :user, :inverse_of => :faces
  after_initialize :init

  def init
    p user.object_id
  end
end

u = User.find(56)
u.object_id
 => 70242500754120 

u.faces.first.user.object_id
  Face Load (0.3ms)  SELECT `faces`.* FROM `faces` WHERE `faces`.`user_id` = 56 LIMIT 1
  User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 56 LIMIT 1
70242477010060
 => 70242500754120 

u.faces.first.user == u
 => true
内部回调中有不同的对象,但外部是相同的。 看起来像在设置了inverse_of magic之前调用了回调。

任何建议的变通方法,允许访问after_initialize回调中的同一个对象? 谢谢

1 个答案:

答案 0 :(得分:0)

init方法实际上是从数据库中提取用户对象并再次返回。

每次初始化一个面时,应用程序都会向DB询问用户,实例化它,打印object_id ......然后忘记它。

我建议使用范围为{/ 3>的用户eager loading

class Face
  belongs_to :user

  scope :with_user, -> { joins(:user) }
end

这将节省您对数据库的调用:)