Как объединить эти множество рейковых задач в одну задачу?
Приложение, над которым я работаю, каждую ночь выполняет задачи импорта, чтобы получить информацию из внешней базы данных, обработать и записать ее в локальную базу данных 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