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回调中的同一个对象? 谢谢
答案 0 :(得分:0)
init方法实际上是从数据库中提取用户对象并再次返回。
每次初始化一个面时,应用程序都会向DB询问用户,实例化它,打印object_id ......然后忘记它。
我建议使用范围为{/ 3>的用户eager loading
class Face
belongs_to :user
scope :with_user, -> { joins(:user) }
end
这将节省您对数据库的调用:)