活动记录回调中的陈旧关联

时间:2018-07-05 22:09:54

标签: ruby-on-rails activerecord

说我有每个用户都拥有一个个人资料的用户:

merge(b, aggregate(cbind(FailCount = PASS_FAIL == "F") ~ NAME, a, sum), 
             by.x = 'Name', by.y = 'NAME')

每个配置文件都属于一个用户。个人资料还具有引用该用户的user.profile的回调:

class User < ApplicationRecord
  has_one :profile
end

最后,说我有一些像这样的杂项rails代码:

class Profile < ApplicationRecord
  belongs_to :user

  after_create do
    puts user.profile.name
  end
end

class FooController < ApplicationController def foo user = User.create! user.profile user.create_profile!(name: 'kevin') end end 函数将在foo挂钩中引发异常(undefined method 'name' for nil:NilClass),因为after_create在配置文件中为空。

在以下情况下似乎会出现此问题: 1.创建一个对象A 2.您引用A与B的关联(为nil) 3.创建与A关联的B 4.您在B上有一个after_create钩子

在这种情况下,A对B的引用是陈旧的,因此A.B.A为零。 user.profile可以解决它,当然:.reloadA.reload.B.A都可以。

对于我尝试过的任何AR挂钩(例如A.B.reload.Aafter_save)都会发生

所以-有什么好的方法吗?还是我必须将after_commit散布在我的代码中的任何地方(或更笨拙的.reload)?

(而且在有人建议之前,不-我不能仅将clear_association_cache替换为user.profile.name。在此精简示例中可以使用,但是我的实际用例是更复杂)。

0 个答案:

没有答案