我遇到了一个回调问题,该回调调用关联上的方法,但该方法取决于导致回调的更改。即使它在after_update
中被调用,协会似乎也看不到变化。
Nerd
有ProblemSet
个,而ProblemSet
属于Nerd
ProblemSet的status
属性可以是:
Nerd的working
属性可以是:
true
- ProblemSet
中至少有一个的状态为"解决" false
- ProblemSet
没有一个状态为"解决" 这是模型的样子:
class ProblemSet < ActiveRecord::Base
belongs_to :nerd
after_update :set_nerd_activity
def set_nerd_activity
if status_changed?
self.nerd.set_working
end
end
end
class Nerd < ActiveRecord::Base
has_many :problem_sets
def set_working
update_column(:working, solving_a_problem_set?)
end
def solving_a_problem_set?
self.problem_sets.any? do |ps|
ps.status == "solving"
end
end
end
problemSet.status
=> "finding"
problemSet.update(status: "solving")
problemSet.nerd.working
=> false # I'm expecting this to be true
我认为问题是nerd
没有看到更改,就好像调用ProblemSet's
时更改Nerd#set_status
状态的数据库事务没有完全提交一样。
我的rspec测试Nerd
只有ProblemSet
次通过Nerd
。但是他们适用于ProblemSet
个.reload
。{/ p>
所以我想也许这是一个rspec的事情。
然后我在控制台中尝试了它,我仍然看到了这个问题。我也小心使用after_commit
检查值是否已更新。
我尝试使用after_save
和after_update
代替ProblemSets
,但这会打断多个{{1}}对书呆子的测试。
知道发生了什么事吗?
答案 0 :(得分:1)
这种方式应该正常工作,我在评论中提供的答案是有效的,因为你在查询关系之外的对象,这应该使它适用于你所拥有的旧代码。
class ProblemSet < ActiveRecord::Base
belongs_to :nerd, inverse_of: :problem_sets
end
class Nerd < ActiveRecord::Base
has_many :problem_sets, inverse_of: :nerd
end