Sunday, September 8, 2024
HomeRuby On RailsProcessing Massive Jobs | Drifting Ruby

Processing Massive Jobs | Drifting Ruby


# Terminal
rails active_storage:set up
rails g scaffold nations title flag:attachment
rails g controller nations/imports
rails g job nations/import
rails g job International locations::CreateRecord
bundle add solid_queue
rails g solid_queue:set up
bundle exec rake solid_queue:begin # needs to be added to the Procfile.dev
# Gemfile
gem "image_processing", "~> 1.2"
gem "solid_queue", "~> 0.3.4"
# config/routes.rb
assets :nations
namespace :nations do
  useful resource :imports, solely: [:new, :create]
finish
# app/controllers/nations/imports_controller.rb
class International locations::ImportsController < ApplicationController
  def new
  finish

  def create
    file = params[:file]

    blob = ActiveStorage::Blob.create_and_upload!(
      io: file,
      filename: file.original_filename,
      content_type: file.content_type
    )
    International locations::ImportJob.perform_later(blob.signed_id)
    redirect_to countries_path, discover: "International locations are being imported..."
  finish
finish
# app/views/nations/imports/new.html.erb
<%= form_with url: countries_imports_path do |f| %>
  <div class="mb-3">
    <%= f.label :file, class: "form-label" %>
    <%= f.file_field :file, class: "form-control" %>
  </div>

  <%= f.submit "Import", class: "btn btn-primary" %>
<% finish %>
# app/views/welcome/index.html.erb
<%= link_to "Import International locations", new_countries_imports_path %>
# app/jobs/nations/import_job.rb
require "csv"

class International locations::ImportJob < ApplicationJob
  queue_as :default

  def carry out(blob_signed_id)
    blob = ActiveStorage::Blob.find_signed(blob_signed_id)

    blob.obtain do |information|
      encoded_data = information.force_encoding("ASCII-8BIT").encode("UTF-8", invalid: :exchange, undef: :exchange, exchange: "?")
      CSV.parse(encoded_data, headers: true) do |row|
        International locations::CreateRecordJob.perform_later(
          title: row["Country"],
          flag_url: row["Flag URL"]
        )
      finish
    finish
  guarantee
    blob.purge_later
  finish
finish
# app/jobs/nations/create_record_job.rb
require "open-uri"

class International locations::CreateRecordJob < ApplicationJob
  queue_as :default

  def carry out(title:, flag_url:)
    nation = Nation.find_or_initialize_by(title: title)
    nation.flag.connect(
      io: URI.open(flag_url),
      filename: File.basename(URI.parse(flag_url).path)
    )
    nation.save!
  finish
finish
# config/utility.rb
config.active_job.queue_adapter = :solid_queue
# config/solid_queue.yml
default: &default
  dispatchers:
    - polling_interval: 1
      batch_size: 500
  employees:
    - queues: "*"
      threads: 1
      processes: 1
      polling_interval: 0.1

improvement:
 <<: *default

check:
 <<: *default

manufacturing:
 <<: *default
# app/views/nations/index.html.erb
<%= image_tag nation.flag.variant(resize_to_limit: [30, 30]) if nation.flag.hooked up? && nation.flag.picture? %>
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments