【问题标题】:Updating the record in two Active Record Callbacks更新两个 Active Record 回调中的记录
【发布时间】:2017-05-08 15:46:23
【问题描述】:

好的,偶然发现了这个奇怪的东西。我的用户模型中有这个。

after_create :assign_role, :subscribe_to_basic_plan

  def assign_role
    self.role = 1
    self.save
  end

  def subscribe_to_basic_plan
    self.customer_id = "hello"
    self.save
  end

(代码为便于说明而简化)

当我创建我的用户并在控制台中检查它时,我得到role: 1, customer_id: nil。但是!,如果我从第一个回调中删除保存一切正常。

  after_create :assign_role, :subscribe_to_basic_plan

  def assign_role
    self.role = 1
  end

  def subscribe_to_basic_plan
    self.customer_id = "hello"
    self.save
  end

产生role: 1, customer_id: "hello"。所以似乎它只读取回调中的第一个.save。我想了解确切的行为是什么以及为什么。我花了很多时间试图查明这一点,并且不想再次偶然发现类似的东西。

编辑:

也许这会有所帮助。当我使用 self.save 时!在subscribe_to_basic_plan 我得到一个错误,记录根本没有保存。将self.save! 放入assign_role 不会改变任何东西,所以问题肯定出在第二个.save。

【问题讨论】:

  • 你有哪些模型验证?
  • 我正在使用带有:validatable 选项的设计。除此之外没有什么。所以基本的电子邮件和密码验证

标签: ruby-on-rails activerecord callback ruby-on-rails-5.1


【解决方案1】:

这个答案是理论上的,因为我需要查看完整的模型代码才能确定。

您在assign_role 中的第一次保存很可能由于某种原因而失败。当它失败并返回 fall 时,会导致 rails 跳过它之后的所有回调。然后你的第二个回调根本不会运行。

按我喜欢的顺序可能的解决方案:

  • 不要使用回调。在保存模型之前让您的控制器设置这些值。
  • 使用 before_create,这样您就不会连续 3 次保存完全相同的模型。
  • 将您的两个回调合并为一个只保存一次的回调。
  • 使用 save(validate: false) 保存,以防验证失败。

【讨论】:

  • 问题似乎不是第一次保存,成功成功,使用save!时不会报错。我认为你是对的,因为验证的过程有些可疑。替换为before_create 并删除所有保存工作,并且可能是正确的方法。由于这个问题更具理论性,并询问为什么会发生这种情况,所以我暂时保持开放状态。
猜你喜欢
  • 1970-01-01
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
相关资源
最近更新 更多