Как объединить эти множество рейковых задач в одну задачу?

Приложение, над которым я работаю, каждую ночь выполняет задачи импорта, чтобы получить информацию из внешней базы данных, обработать и записать ее в локальную базу данных PostgreSQL. Это так можно посмотреть в нашем приложении.

Мы делаем следующее:

  • Создать соединение с внешней базой данных
  • Выполните некоторую конвертацию валюты
  • Сделайте некоторые расчеты по данным на основе среднего
  • Проверьте, существует ли элемент, и обновите, если он изменился.
  • Также проверьте, как оно классифицируется, и измените категорию в соответствии с нашими категориями.
  • Создайте элемент, если он не существует

Все эти данные находятся в разных таблицах во внешней базе данных, поэтому я создал задание для каждой таблицы (около 30), но я чрезмерно повторяюсь, поэтому ищу некоторые рекомендации о том, как высушить этого плохого парня.

Можно ли создать какой-то цикл на коллекции имен таблиц внешней базы данных? Я пробовал это пару раз, но безуспешно. Пожалуйста, найдите код ниже примеров двух разных скриптов импорта.

desc 'Imports ABC Data'
task :abcdeal_import => :environment do

    # Connect to legacy db

    class OldDb < ActiveRecord::Base
        establish_connection :cleardb
        self.table_name = 'abcdeal'
    end

    class Import < OldDb
        self.table_name = 'abcdeal'
    end

    # Currency Conversion

    require 'money'
    require 'money/bank/google_currency'

    # set the seconds after than the current rates are automatically expired
    Money::Bank::GoogleCurrency.ttl_in_seconds = 86400
    # set default bank to instance of GoogleCurrency
    bank = Money::Bank::GoogleCurrency.new

        @gbp = bank.get_rate(:USD, :GBP).to_f
        @eur = bank.get_rate(:USD, :EUR).to_f
        @aud = bank.get_rate(:USD, :AUD).to_f      
        @cad = bank.get_rate(:USD, :CAD).to_f    
        @nzd = bank.get_rate(:USD, :NZD).to_f      

    Import.all.find_each do |u|

        # Define Variables

        @price = u.UnitPrice
        @interest = u.UnitSold
        #@interest_changes = u.unitsold_changes
        @company = u.Company
        @legacy_id = u.id
        @end_date = u.EndDate
        @category = u.Category
        @revenue = u.Revenue

        # Calculate average

        @company_average = company_average(@company)        

        if @company_average == 0
            @company_average = 1
        end

        # Does item exist?
        if Dailydeal.exists?(:legacy_id => @legacy_id, :company => @company)
        # It exists.
            @historical_interest = Product.where(:legacy_id => @legacy_id).pluck(:interest)                
            # Another statement to check that the Interest != UnitSold
            if @interest != @historical_interest
            Product.where(:legacy_id => @legacy_id, :company => @company).update_all(:interest => @interest, :end_date => @end_date, :interest_changes => @interest_changes, :status => average_change_interest, :revenue => @revenue, :revenue_eur => eur_revenue_currency_conversion, :revenue_aud => aud_revenue_currency_conversion, :revenue_gbp => gbp_revenue_currency_conversion, :revenue_cad => cad_revenue_currency_conversion, :revenue_nzd => nzd_revenue_currency_conversion)
            end
        else
        # Doesn't exist

        # Set Category            

        case @category
            when 'Apparel'
                @category = 'Apparel & Footwear'

            when 'Gadgets'
                @category = 'Electronics & Accessories'

            when 'Gifts'
                @category = 'Miscellaneous'

            when 'Health & Cosmetics'
                @category = 'Health & Beauty'

            when 'Home'
                @category = 'Home & Furniture'

            when 'Other'
                @category = 'Miscellaneous'

            when 'Toys'
                @category = 'Toys & Kids'

            else

                @category

            end

        Product.create(
              :name => u.ProductName,
              :link => u.ProductLink,
              :image_url => u.ImageUrl,
              :price => u.UnitPrice,
              :interest => u.UnitSold,
              :start_date => u.StartDate,
              :end_date => u.EndDate,
              :revenue => u.Revenue,
              :company => u.Company,
              :category => @category,
              :country => u.Country,
              :price_eur => eur_currency_conversion,
              :price_aud => aud_currency_conversion,
              :price_gbp => gbp_currency_conversion,
              :price_cad => cad_currency_conversion,
              :price_nzd => nzd_currency_conversion,
              :revenue_eur => eur_revenue_currency_conversion,
              :revenue_aud => aud_revenue_currency_conversion,
              :revenue_gbp => gbp_revenue_currency_conversion,
              :revenue_cad => cad_revenue_currency_conversion,
              :revenue_nzd => nzd_revenue_currency_conversion,
              :status => average_change_interest,
              :legacy_id => u.id)
        end
    end

    puts "Successfully imported data from abc"

end

desc 'Imports def Data'
task :def_import => :environment do

    # Connect to legacy db

    class OldDb < ActiveRecord::Base
        establish_connection :cleardb
        self.table_name = 'def'
    end

    class Import < OldDb
        self.table_name = 'def'
    end

    # Currency Conversion

    require 'money'
    require 'money/bank/google_currency'

    # set the seconds after than the current rates are automatically expired
    Money::Bank::GoogleCurrency.ttl_in_seconds = 86400
    # set default bank to instance of GoogleCurrency
    bank = Money::Bank::GoogleCurrency.new

        @gbp = bank.get_rate(:USD, :GBP).to_f
        @eur = bank.get_rate(:USD, :EUR).to_f
        @aud = bank.get_rate(:USD, :AUD).to_f      
        @cad = bank.get_rate(:USD, :CAD).to_f    
        @nzd = bank.get_rate(:USD, :NZD).to_f      

    Import.all.find_each do |u|

        # Define Variables

        @price = u.UnitPrice
        @interest = u.UnitSold
        #@interest_changes = u.unitsold_changes
        @company = u.Company
        @legacy_id = u.id
        @end_date = u.EndDate
        @category = u.Category
        @revenue = u.Revenue

        # Calculate average

        @company_average = company_average(@company)

        if @company_average == 0
            @company_average = 1
        end

        # Does item exist?
        if Product.exists?(:legacy_id => @legacy_id, :company => @company)
        # It exists.
            @historical_interest = Product.where(:legacy_id => @legacy_id).pluck(:interest)                
            # Another statement to check that the Interest != UnitSold
            if @interest != @historical_interest
                Product.where(:legacy_id => @legacy_id, :company => @company).update_all(:interest => @interest, :end_date => @end_date, :interest_changes => @interest_changes, :status => average_change_interest, :revenue => @revenue, :revenue_eur => eur_revenue_currency_conversion, :revenue_aud => aud_revenue_currency_conversion, :revenue_gbp => gbp_revenue_currency_conversion, :revenue_cad => cad_revenue_currency_conversion, :revenue_nzd => nzd_revenue_currency_conversion)
            end
        else
        # Doesn't exist

        # Set Categories    

        case @category

            when 'Adult Products'
                @category

            when 'Arts & Crafts', 'Furniture', 'Garden', 'Large Appliances', 'Lighting', 'Outdoor & Patio', 'Stationary', 'Storage & Organization'
                @category = 'Home & Furniture'

            when 'Audio & Audio Accessories', 'Electronics Accessories', 'Gadgets', 'GPS & Car Accessories', 'Tools & Hardware', 'Tablets'
                @category = 'Electronics & Accessories'

            when 'Automotive Services'
                @category = 'Automotive'

            when 'Bath', 'Bedding'
                @category = 'Bed & Bath'

            when 'Books & Media', 'Canada', 'Gifts', 'Miscellaneous', 'Recreational'
                @category = 'Miscellaneous'

            when 'Cafe, Bakery & Treats', 'Kitchen'
                @category = 'Kitchen'

            when 'Casual Restaurants', 'Cleaning Services', 'Dance Classes', 'Fast Food', 'Fine Dining', 'Home Services', 'Local Exhibits & Shows', 'Other Services', 'Other Workshops & Classes', 'Outdoor Adventures', 'Other Activities', 'Tours & Sightseeing', 'Fitness Classes', 'Massage', 'Med Spa', 'Salon & Hair Care Services', 'Spa Services', 'Yoga, Pilates & Aerobics'
                @category = 'Experiences'

            when 'Cats', 'Dogs', 'Pets', 'Pets Accessories'
                @category = 'Pets Accessories'

            when 'Clothing', 'Clothing, Fashion & Accessories', 'Fashion & Accessories', 'Footwear', "Men's", 'Unisex', "Women's"
                @category = 'Apparel & Footwear'

            when 'Earrings', 'Fashion Accessories'
                @category = 'Jewellery & Accessories'

            when 'Fitness', 'Hair Care', 'Hair Removal', 'Health Care', 'Manicure & Pedicure', 'Other Beauty & Spa', 'Other Health & Fitness', 'Personal Care', 'Teeth Whitening', 'Wellness & Nutrition', 'Facial'
            @category = 'Health & Beauty'

            when 'Golf', 'Sports', 'Football', 'Baseball', 'Hockey', 'Ice Hockey'
                @category = 'Sporting Accessories'

        else

            @category

        end            

        Product.create(
              :name => u.ProductName,
              :link => u.ProductLink,
              :image_url => u.ImageUrl,
              :price => u.UnitPrice,
              :interest => u.UnitSold,
              :start_date => u.StartDate,
              :end_date => u.EndDate,
              :revenue => u.Revenue,
              :company => u.Company,
              :category => @category,
              :country => u.Country,
              :price_eur => eur_currency_conversion,
              :price_aud => aud_currency_conversion,
              :price_gbp => gbp_currency_conversion,
              :price_cad => cad_currency_conversion,
              :price_nzd => nzd_currency_conversion,
              :revenue_eur => eur_revenue_currency_conversion,
              :revenue_aud => aud_revenue_currency_conversion,
              :revenue_gbp => gbp_revenue_currency_conversion,
              :revenue_cad => cad_revenue_currency_conversion,
              :revenue_nzd => nzd_revenue_currency_conversion,
              :status => average_change_interest,
              :legacy_id => u.id)
        end
    end

    puts "Successfully imported data from def"

end

1 ответ

Это действительно выглядит повторяющимся, почему вы не можете придумать такую ​​структуру и не поместить все в формат ниже

.
├── Rakefile
└── models
    ├── import.rb
    └── old_db.rb

Я делал подобные вещи, для одного из моих проектов, где я извлекаю данные из БД, вы также можете обратиться к нему здесь https://github.com/ankit8898/sql-server-mapper

Другие вопросы по тегам