我正在努力解决如何正确实现Rails回调:
我有一个模型X(具有属性A,B和C),与模型Y具有has_many关系(具有属性C,D和E - 即两者都具有属性C)。我在X上进行了模型验证,声明所有关联模型Y的属性C必须与模型X的属性相匹配。
因此,在更新模型X期间修改C属性时,我使用了'before_validation,on:update'回调来首先更改所有关联的Y模型上的C值,以匹配模型X上更新的C值的C值这允许模型X验证和更新。但是,在模型X重新加载时,关联模型Y上的修改后的C值不会粘滞并恢复到原始值。
那么我是否还需要'after_save'回调才能“锁定”模型Y的变化?或者我应该使用不同的方法来做这种事情?
-----更新------------
我想我可能会错误地保存到数据库:
我的回调代码
class X
....
before_validation :update_Ys, on: :update
....
def update_Ys
self.Ys.each do |k|
k['C'] = self.C
k.save
end
end
答案 0 :(得分:0)
您需要在模型X上添加一个before_save回调,然后检查它是否有更改的属性C.如果有,您需要应用所有逻辑来相应地更新模型Y.
答案 1 :(得分:0)
我最终做的是有两个回调
首先,'before_validation,on:update'其中
def update_Ys
self.Ys.each do |k|
k['C'] = self.C
end
end
允许模型X的验证通过
然后是'after_save',我直接点击数据库,保存更新的模型Ys。我猜这不是最好的方法,所以如果有人有关于如何改进的建议,请告诉我。