说我有每个用户都拥有一个个人资料的用户:
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
可以解决它,当然:.reload
或A.reload.B.A
都可以。
对于我尝试过的任何AR挂钩(例如A.B.reload.A
或after_save
)都会发生
所以-有什么好的方法吗?还是我必须将after_commit
散布在我的代码中的任何地方(或更笨拙的.reload
)?
(而且在有人建议之前,不-我不能仅将clear_association_cache
替换为user.profile.name
。在此精简示例中可以使用,但是我的实际用例是更复杂)。