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