在两个Active Record回调中更新记录

时间:2017-05-08 15:46:23

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

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

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上。

1 个答案:

答案 0 :(得分:1)

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

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

我首选订单中的可能解决方案:

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