ruby-on-rails - inverse_of 在 after_initialize 内不起作用

标签 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 魔法之前调用的回调。

是否有任何解决方法建议,允许在 after_initialize 回调中访问相同的对象?
谢谢

最佳答案

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

每次初始化人脸时,应用程序都会向数据库询问用户,实例化它,打印 object_id ......然后忘记它。

我建议使用 eager loading具有范围的用户:

class Face
  belongs_to :user

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

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

关于ruby-on-rails - inverse_of 在 after_initialize 内不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18374923/

相关文章:

ruby-on-rails - 在Rails中使用局部的最佳实践

ruby - 在 Rails 中显示 ruby​​ 代码块的计时

ruby-on-rails - 将自动增量添加回Rails的主键列

ruby-on-rails - 如何在不更改原始类的情况下替换 belongs_to 关联

ruby-on-rails - rails : unexpected behaviour in Chrome and Firefox when refreshing invalid form page

ruby-on-rails - 在 application.scss 中包含来自 node_modules 的 css

ruby-on-rails - 如何在 Rails 5 中添加自定义谓词生成器?

ruby-on-rails - rails 3 : rollback for after_create

ruby-on-rails - 虚拟属性和质量赋值

ruby-on-rails - Rails Relation#update_all 比 Relation#update 消耗更多的内存