使用before_validation回调更改关联的模型

时间:2014-05-28 04:46:38

标签: ruby-on-rails validation callback beforeupdate

我正在努力解决如何正确实现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

2 个答案:

答案 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。我猜这不是最好的方法,所以如果有人有关于如何改进的建议,请告诉我。