【问题标题】:Simultaneous Validation of Multiple Model Updates in Rails在 Rails 中同时验证多个模型更新
【发布时间】:2014-07-17 01:10:35
【问题描述】:

在rails 中,您可以使用accepts_nested_attributes_for 在父子关系中同时创建多个模型。但是,假设您具有相同的关系,但是您想同时更新两个模型上的字段,如果一个模型验证失败,您可以确定另一个模型也不会保存。这怎么可能?

def edit_multiple
  @first=First.update(first_params)
  @second=Second.update(second_params)
end

如果@first 通过验证但@second 没有通过,那么我们将遇到我不希望出现的情况:一个模型正在更新,而另一个没有。

【问题讨论】:

  • 总是这样吗?如果是这样,您可以在两个对象之间的关系上设置autosave: trueapi.rubyonrails.org/classes/ActiveRecord/… -- 如果这对您来说似乎是正确的方法,如果您愿意,我可以在此基础上添加更多答案。
  • 不幸的是,我希望这发生在一个行动中

标签: ruby-on-rails rails-activerecord


【解决方案1】:

那是交易是为了:

First.transaction do
  @first=First.update(first_params)
  @second=Second.update(second_params)
end

现在他们两个一起成功或失败。更多信息ActiveRecord transactions

【讨论】:

  • 当然会,但它会在最好的情况下以异常结束,在最坏的情况下会以一半保存的对象结束(没有爆炸!在该方法调用上),它不会以具有非空错误的对象结束您可以呈现给用户的哈希值。
【解决方案2】:

首先检查所有模型实例是否为@model.valid?,然后在不验证的情况下保存@model.save(validate: false)

按照 boulder 的建议放置 transaction 仍然是一个好主意,以防发生意外异常

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2011-05-21
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多