ruby-on-rails 如何在Ruby on Rails中更新数据库事务外的记录

xpszyzbs  于 11个月前  发布在  Ruby
关注(0)|答案(1)|浏览(106)

我有一个长时间运行的后台作业,它更新多个数据库记录,因此我将其包含在数据库事务中。我还有一个JobStatus数据库记录,其中包含一个percent_complete字段,用于让用户知道后台作业完成的时间。当后台作业运行时,网站轮询服务器以从相关联的JobStatus记录获得percent_complete值。
在 Package 在数据库事务中的后台作业中,如何在数据库事务之外更新JobStatus记录,以便在网站轮询时返回当前的percent_complete值?

class BackgroundJob < ApplicationJob
  def perform(job_status_id)
    job_status = JobStatus.find(job_status_id)
    job_status.update(percent_complete: 0)
    ActiveRecord::Base.transaction do
      # ... update some records
      job_status.update(percent_complete: 25)
      # ... update some more records
      job_status.update(percent_complete: 50)
      # ... update some more records
      job_status.update(percent_complete: 75)
      # ... finish updating records
      job_status.update(percent_complete: 100)
    end
  end
end

字符串
如何在数据库事务之外只对job_status记录进行更新?
我用的是Ruby on Rails 7.0

zvms9eto

zvms9eto1#

因此,您需要为JobStatus模型使用与事务中的连接不同的数据库连接。有几种方法可以从池explained here中手动检出您自己的连接,但是您需要使用原始SQL进行更新。
就我个人而言,我会使用Multiple Database stuff,并将JobStatus模型设置为从一个单独的类继承一个connects_to,以确保它使用不同的DB连接(到同一个DB):
于是:

数据库.yml

development:
  primary: &primary
    your: db
    details: here
  job_status:
    <<: *primary

字符串

app/models/job_status_abstract.rb

class JobStatusAbstract < ApplicationRecord
  self.abstract_class = true

  connects_to database: { writing: :job_status }
end

app/models/job_status.rb

class JobStatus < JobStatusAbstract

  # ...rest of your model

相关问题