在事务内部更新后,ActiveRecord不会重新加载嵌套对象

时间:2017-09-13 19:45:17

标签: ruby-on-rails oracle ruby-on-rails-4 activerecord transactions

我正在使用Rails 4和Oracle 12c,我需要更新用户的状态,然后在另一个模型的验证中使用新状态我还需要更新:

class User
  has_many :posts

  def custom_update!(new_status)
    relevant_posts = user.posts.active_or_something
    ActiveRecord::Base.transaction do
      update!(status: new_status)
      relevant_posts.each { |post| post.update_stuff! }
    end
  end
end

class Post
  belongs_to :user

  validate :pesky_validation

  def update_stuff!
    # I can call this from other places, so I also need a transaction here
    ActiveRecord::Base.transaction do
      update!(some_stuff: 'Some Value')
    end
  end

  def pesky_validation
    if user.status == OLD_STATUS
      errors.add(:base, 'Nope')
    end
  end
end

但是,这是失败的,我收到来自pesky_validation的验证错误,因为Post内的用户没有更新状态。

问题是,当我第一次更新用户时,relevant_posts变量中已经实例化的用户尚未更新,通常我需要解决的是调用{{1}但是,也许是因为我在交易中,这不起作用,reload失败。

例如,

pesky_validation会将用户重新加载到更新之前的旧状态,并且由于事务尚未提交,因此我假设它已经过了。如何解决此问题并更新所有对新状态的引用?

0 个答案:

没有答案