【问题标题】:Altering an associated model using a before_validation callback使用 before_validation 回调更改关联模型
【发布时间】:2014-05-28 04:46:38
【问题描述】:

我正在为如何正确实现 Rails 回调而苦苦挣扎:

我有一个模型 X(具有属性 A、B 和 C)与模型 Y(具有属性 C、D 和 E - 即都具有属性 C)具有 has_many 关系。我在 X 上有一个模型验证,声明所有关联模型 Y 的属性 C 必须与模型 X 的属性匹配。

因此,在更新模型 X 期间修改 C 属性时,我使用了“before_validation, on :update”回调来首先更改所有关联 Y 模型上的 C 值,以匹配模型 X 上更新后的 C 值. 这使得模型 X 可以很好地验证和更新。但是,关联模型 Y 上修改后的 C 值不会在模型 X 重新加载时保持不变并恢复到其原始值。

那么我是否还需要一个“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

【问题讨论】:

    标签: ruby-on-rails validation callback beforeupdate


    【解决方案1】:

    您需要在模型 X 上添加 before_save 回调。然后检查它是否具有更改的属性 C。如果有,您将需要在该回调中应用所有逻辑以相应地更新模型 Y。

    【讨论】:

    • 那么,这是否意味着我会有两个回调? IE。一个 before_validation 回调,其逻辑应用于更新模型 Ys(以便模型 X 上的验证约束将通过),然后还有一个 before_save(具有相同的逻辑)?
    • 好的,我试过了,但验证失败。这就是我预期会发生的事情,因此我最初使用 before_validation 在模型 X 验证之前更新模型 Ys(这需要更新模型 Ys 才能通过)。
    【解决方案2】:

    我最终做的是有两个回调

    首先,'before_validation, on :update'

    def update_Ys
      self.Ys.each do |k|
        k['C'] = self.C 
      end
    end
    

    允许通过模型 X 的验证

    然后是“after_save”,我直接在数据库中保存更新的模型 Ys。我猜这不是最好的方法,所以如果有人对如何改进有任何建议,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多