Ruby On Rails Mail Routine Not sending - ruby-on-rails
I Have a ROR IF statement that is supposed to look up a record and then send emails based on the login can anyone tell me what is wrong in the syntax?
this is now working but there is two test cases that return ActiveRecord::RecordNotFound (Couldn't find SignOn with userw1 = xxx#example.com):
app/models/order.rb:219:in `submit_order'
class Order < ActiveRecord::Base
# NOTE: ensure that you always setup methods here to include and filter on
# query_account_number as a security measure.
establish_connection "web_#{RAILS_ENV}"
has_many :order_details, :dependent => :destroy, :order => 'id DESC'
def self.delete_item query_account_number, login, id
order = Order.first(:conditions => {:account_number => query_account_number, :login => login})
detail = order.order_details.first(:conditions => {:id => id})
detail.destroy if detail
# Here we would delete the order, but have chosen to leave it so they do not have
# questionable gaps in IDs.
end
def self.verify_upc1 upc_rule, upc1
"Invalid UPC Prefix" unless Item.first(:conditions => ["rul31c = ? AND CONCAT(TRIM(comi1c), 'A') = ?", upc_rule, upc1 + "A"],
:select => "style")
end
def self.verify_upc2 upc_rule, upc1, upc2
"Invalid UPC Prefix or Subnumber" unless Item.first(:conditions => ["rul31c = ? AND CONCAT(TRIM(comi1c), CONCAT(TRIM(arsb1c), 'A')) = ?", upc_rule, upc1 + upc2 + "A"],
:select => "style")
end
def self.verify_style upc_rule, style
"Invalid Style" unless Item.first(:conditions => ["rul31c = ? AND CONCAT(TRIM(style), 'A') = ?", upc_rule, style + "A"],
:select => "style")
end
def self.update_quantity query_account_number, login, id, quantity
if quantity.to_i > 0
order = Order.first(:conditions => {:account_number => query_account_number, :login => login})
detail = order.order_details.first(:conditions => {:id => id})
if detail
detail.quantity = quantity.to_i
detail.save
end
end
end
def self.update_order_note query_account_number, login, order_note
order = Order.first(:conditions => {:account_number => query_account_number, :login => login})
order.note = order_note
order.save
end
def self.update_order_item_note query_account_number, login, id, note
order = Order.first(:conditions => {:account_number => query_account_number, :login => login})
detail = order.order_details.first(:conditions => {:id => id})
if detail
detail.note = note
detail.save
end
end
def self.add_item query_account_number, login, quantity, upc1, upc2, price_code, upc_rule
if quantity.to_i > 0
order = Order.first(:conditions => {:account_number => query_account_number, :login => login})
order = Order.add_order_header(query_account_number, login) if order.blank?
if order
item = Item.first(:conditions => ["rul31c = ? AND CONCAT(TRIM(comi1c), CONCAT(TRIM(arsb1c), 'A')) = ?", upc_rule, upc1 + upc2 + "A"],
:select => "style, color, size, pnum35, cono35, comi1c, arsb1c, ptyp35")
price = Price.first(:conditions => {:catnwp => item.pnum35, :conowp => item.cono35, :listwp => price_code}, :select => "prcewp") unless item.blank?
if item and price
order_detail = OrderDetail.new(:style => item.style,
:order_id => order.id,
:quantity => quantity,
:color => item.color,
:size => item.size)
order_detail.save
# Return a cart item hash
cart_contents = []
cart_contents << {:style => item.style,
:color => item.color,
:size => item.size,
:quantity => quantity,
:name => ProItem.short_description(item.style),
:price => price.prcewp,
:type => item.ptyp35,
:upc => item.comi1c + item.arsb1c,
:id => order_detail.id}
end
end
end
end
def self.order_info_update query_account_number, login, info
order = Order.first(:conditions => {:account_number => query_account_number, :login => login})
if order
if info.has_key?("name")
order.name = info[:name]
order.address1 = info[:address1]
order.address2 = info[:address2]
order.address3 = info[:address3]
order.city = info[:city]
order.state = info[:state]
order.zip = info[:zip]
end
if info.has_key?("po_number")
order.po_number = info[:po_number]
end
order.save
# where does po number go???
end
end
def self.mailing_address query_account_number, login
o = Order.first(:conditions => {:account_number => query_account_number, :login => login})
{:name => o.name, :address1 => o.address1, :address2 => o.address2, :address3 => o.address3, :city => o.city, :state => o.state, :zip => o.zip} if o
end
def self.order_note query_account_number, login
o = Order.first(:conditions => {:account_number => query_account_number, :login => login}, :select => "note")
o.note if o
end
def self.cart_contents query_account_number, login, price_code, upc_rule
# TODO: what to do if item changed since they put it in cart?
# Perhaps we expire a cart after a while, but, that still is not a perfect solution.
# Ideally here we go through each style, make sure it is still valid for the customer, and
# check color/size as well.
order_items = Order.first(:conditions => {:account_number => query_account_number, :login => login} )
if order_items
cart_contents = []
order_items.order_details.each do |oi|
as400_item = Item.first(:conditions => {:rul31c => upc_rule, :style => oi.style.ljust(9), :color => oi.color, :size => oi.size },
:select => "pnum35, cono35, ptyp35, comi1c, arsb1c")
price = Price.first(:conditions => {:catnwp => as400_item.pnum35, :conowp => as400_item.cono35, :listwp => price_code}, :select => "prcewp") unless as400_item.blank?
cart_contents << {:style => oi.style,
:color => oi.color,
:size => oi.size,
:quantity => oi.quantity,
:name => ProItem.short_description(oi.style),
:price => price.prcewp,
:type => as400_item.ptyp35,
:note => oi.note,
:upc => as400_item.comi1c + as400_item.arsb1c,
:id => oi.id} if as400_item and price
end unless order_items.blank?
cart_contents
end
end
def self.cart_contents_count query_account_number, login
order_items = Order.first(:conditions => {:account_number => query_account_number, :login => login} )
count = 0
order_items.order_details.each {|oi| count += oi.quantity } if order_items
count
end
def self.cart_contents_total query_account_number, login, price_code, upc_rule
order_items = Order.first(:conditions => {:account_number => query_account_number, :login => login} )
total = 0
order_items.order_details.each do |oi|
as400_item = Item.first(:conditions => {:rul31c => upc_rule, :style => oi.style.ljust(9), :color => oi.color, :size => oi.size },
:select => "pnum35, cono35, ptyp35")
price = 0
if !as400_item.blank?
price = Price.first(:conditions => {:catnwp => as400_item.pnum35, :conowp => as400_item.cono35, :listwp => price_code}, :select => "prcewp")
total += (oi.quantity * price.prcewp.to_f)
end
end if order_items
total
end
def self.add_order_details query_account_number, login, items, notes = Hash.new
result = false
if items
# If there is not an order record, create one. Basically we only
# allow one open order per login at a time, and if there is
# one already, we continue to append order_detail records to it.
order = Order.first(:conditions => {:account_number => query_account_number, :login => login.upcase})
order = Order.add_order_header(query_account_number, login) if order.blank?
items.each do |key, value|
if value.to_i > 0
result = true
style = key[0..8]
color = key[9..11]
size = key[12..14]
order_detail = OrderDetail.new(:style => style,
:order_id => order.id,
:quantity => value,
:color => color,
:size => size,
:note => (notes ? notes[key] : ''))
order_detail.save
end
end if order
end
result
end
def self.submit_order query_account_number, login, price_code, distributor_number
o = Order.first(:conditions => {:account_number => query_account_number, :login => login})
# TODO: transaction or some error handling
if o
# Find all associated records we need.
customer = Customer.first(:conditions => {:cusn05 => query_account_number}, :select => "cono05, cgp405, slmn05, list20" )
sign_on = SignOn.first(:conditions => {:userw1 => login.upcase},
:select => "idnow1, bsnamw1, accntw1, prfdstw1, cntacw1, bsadd1w1, bsadd2w1, bsadd3w1, bscityw1, bsstcdw1, bszipw1, acctypw1")
distributor = Distributor.first(:conditions => {:cusnp1 => distributor_number}, :select => "cnam05, emailp1")
if sign_on.acctypw1.strip == "DS"
rec = SignOn.find_by_userw1!(login)
webid = rec.prfdstw1
elsif sign_on.acctypw1.strip == "DSD"
rec = SignOn.find_by_userw1!(login)
webid = rec.prfdstw1
end
#cnt = Weboel23.count(:all,:conditions => {:act223 => mp})
weboel23 = Weboel23.first(:conditions => {:act223 => webid}, :select => "emal23")
#cnt=weboel23.count
approval0=Weboel23.get_email_by_account0(webid)
approval1=Weboel23.get_email_by_account1(webid)
approval2=Weboel23.get_email_by_account2(webid)
approval3=Weboel23.get_email_by_account3(webid)
approval4=Weboel23.get_email_by_account4(webid)
# weboel23 = Weboel23.each(:conditions => {:act223 => mp}, :select => "emal23")
#approval = weboel23.emal23
#f=File.open("/var/www/onlineordering.coastalpet.com/log/debug3.txt")
#establish_connection "as400_#{RAILS_ENV}"
#f.puts "prfdstw1"
#f.puts rec = SignOn.find_by_userw1!(login)
#f.puts "type="+elephant
#f.puts "email="+approval0
#f.close
# s = find_by_sql ["SELECT EMAL23 emal23 FROM WEBOEL23 WHERE ACT223 = ?", distributor_number]
# d << { :id => s[0].emal23 } unless s.blank?
if customer and sign_on
as400_order_id = "WB" + o.id.to_s.rjust(8, "0")
total = 0
count = 0
line = 1 # Start at 1 per Ron Hoopes 2/14/2011
o.order_details.each do |oi|
item = Item.first(:conditions => {:rul31c => customer.cgp405, :style => oi.style.ljust(9), :color => oi.color, :size => oi.size },
:select => "comi1c, arsb1c, chdt1c, pnum35, cono35, pdes35")
price = Price.first(:conditions => {:catnwp => item.pnum35, :conowp => item.cono35, :listwp => price_code}, :select => "prcewp") unless item.blank?
if item and price
WebOrderDetail.create(:conowd => customer.cono05,
:uniqwd => as400_order_id,
:linewd => line,
:itemwd => oi.style.ljust(9) + oi.color + oi.size,
:barcwd => item.comi1c.strip + item.arsb1c.strip + item.chdt1c.strip,
:altiwd => "",
:itmdwd => item.pdes35,
:qtywd => oi.quantity,
:uprcwd => price.prcewp.to_f.round_to(2),
:listwd => customer.list20,
:dtdrwd => "0",
:dcd1wd => "",
:dsc1wd => "0",
:dcd2wd => "",
:dsc2wd => "0")
# Create any order ITEM notes.
unless oi.note.blank?
oi.note.scan(/.{1,70}/).each_with_index do |note, index|
WebOrderNote.create(:conown => customer.cono05,
:textwn => note,
:uniqwn => as400_order_id,
:linewn => line,
:seqwn => index)
end
end
count += oi.quantity.to_i
total += oi.quantity.to_i * price.prcewp.to_f.round_to(2)
line += 1
end
end
# Create any order notes.
unless o.note.blank?
o.note.scan(/.{1,70}/).each_with_index do |note, index|
WebOrderNote.create(:conown => customer.cono05,
:textwn => note,
:uniqwn => as400_order_id,
:linewn => 0,
:seqwn => index)
end
end
# Coastal's definition a current century is off by one, hence the math for the date.
as400_order_header = WebOrder.new(:conowc => customer.cono05,
:uniqwc => as400_order_id,
:idnowc => sign_on.idnow1,
:namewc => o.name,
:addr1wc => o.address1,
:addr2wc => o.address2,
:addr3wc => o.address3,
:citywc => o.city,
:statewc => o.state,
:zipcdwc => o.zip,
:cusnwc => query_account_number,
:dtordwc => Utilities.to_db2_date(Date.today),
:shpdtwc => Utilities.to_db2_date(Date.today),
:cusowc => o.po_number.blank? ? as400_order_id : o.po_number,
:slmnwc => customer.slmn05,
:rulewc => customer.cgp405,
:listwc => customer.list20,
:valuewc => total.to_f.round_to(2),
:statwc => "")
if as400_order_header.save
# Sent confirmation email, if required. Only send it for users that chose a distributor,
# whether they had to choose one or not. We determine this by looking at the account number
# in the sign_on and comparing it with the order number we are using for the order. If
# that is different, it indicates that they chose a distributor.
# These are used in the email body, key for the hash is the replacement tags, capitalized, &
# prepended and appended with '##', e.g. ##NAME## - and any underlines are replaced with space
email_details = {"name" => sign_on.bsnamw1,
"order_number" => as400_order_id,
"order_total" => format('$%.2f', total),
"order_count" => count.to_s,
"order_date" => Date.today.to_s,
"distributor_name" => (distributor ? distributor.cnam05 : ""),
"distributor_contact" => "UNKNOWN",
"customer_name" => sign_on.bsnamw1,
"customer_address" => sign_on.bsadd1w1.strip + (!sign_on.bsadd2w1.blank? ? "<br>" + sign_on.bsadd2w1.strip : "") + (!sign_on.bsadd3w1.blank? ? "<br>" + sign_on.bsadd3w1.strip : ""),
"customer_city" => sign_on.bscityw1,
"customer_state" => sign_on.bsstcdw1,
"customer_zip" => sign_on.bszipw1,
"customer_contact" => sign_on.cntacw1}
Mailer.deliver_order_coastal_notify_email("Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation", email_details)
# Per Dana 6/30/2012, JUST DS
if sign_on.acctypw1.strip == "DS" or sign_on.acctypw1.strip == "DSD"
# If there is no distributor email address, the mailer model will substitute in the admin's email from their settings
Mailer.deliver_order_distributor_approval_email(distributor ? distributor.emailp1 : "", "Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation #{approval0} #{approval1}", email_details)
if approval0!=""
Mailer.deliver_order_confirmation_email(login, "Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation", email_details)
Mailer.deliver_order_distributor_approval_email(approval0, "Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation ", email_details)
Mailer.deliver_order_coastal_notify_email("Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation", email_details)
end
if approval1!=""
Mailer.deliver_order_confirmation_email(login, "Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation", email_details)
Mailer.deliver_order_distributor_approval_email(approval1, "Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation ", email_details)
Mailer.deliver_order_coastal_notify_email("Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation", email_details)
end
if approval2!=""
Mailer.deliver_order_confirmation_email(login, "Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation", email_details)
Mailer.deliver_order_distributor_approval_email(approval2, "Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation ", email_details)
Mailer.deliver_order_coastal_notify_email("Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation", email_details)
end
if approval3!=""
Mailer.deliver_order_confirmation_email(login, "Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation", email_details)
Mailer.deliver_order_distributor_approval_email(approval3, "Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation ", email_details)
Mailer.deliver_order_coastal_notify_email("Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation", email_details)
end
if approval4!=""
Mailer.deliver_order_confirmation_email(login, "Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation", email_details)
Mailer.deliver_order_distributor_approval_email(approval4, "Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation ", email_details)
Mailer.deliver_order_coastal_notify_email("Coastal Pet Online Ordering<noreply#coastalpet.com>", "Order Confirmation", email_details)
end
Mailer.deliver_order_distributor_approval_email(weboel23 ? weboel23.emal23: "", "Coastal Pet Online Ordering<noreply#coastalpet.com>", "*Order Confirmation", email_details)
Mailer.deliver_order_distributor_approval_email("robert.kendall#coastalpet.com", "Coastal Pet Online Ordering<noreply#coastalpet.com>", "*Order Confirmation", email_details)
end
# Al ways notify Coastal staff
# Update the last ordered date (used for reminders)
User.update_last_order_date(login)
o.destroy
as400_order_id
end
end
end
end
def self.count_user_orders query_account_number, login
count = Order.first(:conditions => {:account_number => query_account_number, :login => login})
count.order_details.count unless count.blank? or count == 0
end
def self.reorder(order_number, login, query_account_number, upc_rule, price_code, mode)
warnings = ""
# If we are not in check mode, then blank out cart
self.empty_cart(query_account_number, login) if mode != "check"
# Get the previous order
oo = WebOrder.get_previous_order(order_number, login)
# Go through each line item
oo.each do |ooi|
# Verify it still exists in the AS400 and is same price
# Note that this reports back a -1 if it cannot find the
# same style+color+size option, otherwise just reports
# price if it finds it.
current_price = Item.check_item_exists(query_account_number, ooi[:style], ooi[:color], ooi[:size], upc_rule, price_code)
# If item was not found, we can't add it.
# We could spend more time to determine if it was the color, or size, or that
# the style itself is not available, but it seems reasonable enough to
# present it this way. Really should not be doing this "presentation" in
# the model, but we don't have views setup for Ajax so we have to give the
# controller the text we want rendered.
if current_price == -1
warnings += "SKU "+ ooi[:style].to_s + ooi[:color].to_s + ooi[:size].to_s + " is no longer available<br />"
else
# If price did not match, append to list of warnings
if current_price.to_f.round_to(2) != ooi[:price].to_f.round_to(2)
warnings += "SKU "+ ooi[:style].to_s + ooi[:color].to_s + ooi[:size].to_s + " price is " +
ActionController::Base.helpers.number_to_currency(current_price) + " and it was " +
ActionController::Base.helpers.number_to_currency(ooi[:price]) + "<br />"
end
# If not in check mode, add item to cart
# In this case, we don't care that the price did
# not match, we still add it.
populate_cart(query_account_number, login, ooi[:style], ooi[:color], ooi[:size], ooi[:quantity], ooi[:line_item_note], ooi[:order_note]) if mode != "check"
end
end
mode == "check" ? warnings : ""
end
def self.empty_cart query_account_number, login
order = Order.first(:conditions => {:account_number => query_account_number, :login => login})
order.destroy if order
end
def self.populate_cart query_account_number, login, style, color, size, quantity, note, order_note
# If there is not an order record, create one. Basically we only
# allow one open order per login at a time, and if there is
# one already, we continue to append order_detail records to it.
order = Order.first(:conditions => {:account_number => query_account_number, :login => login.upcase})
order = Order.add_order_header(query_account_number, login) if order.blank?
# These can be null for kits, and we don't like nulls in the database for this
color = "" if color.blank?
size = "" if size.blank?
if order
order.note = order_note # yeah we do this each time but while inefficient it works
order.save
order_detail = OrderDetail.new(:style => style,
:order_id => order.id,
:quantity => quantity,
:color => color,
:size => size,
:note => note)
order_detail.save
end
end
private
def self.add_order_header query_account_number, login
# Default address info to sign_on
sign_on = SignOn.first(:conditions => {:userw1 => login.upcase}, :select => "bsnamw1, bsadd1w1, bsadd2w1, bsadd3w1, bscityw1, bsstcdw1, bszipw1")
if sign_on
order = Order.new(:login => login,
:account_number => query_account_number,
:name => sign_on.bsnamw1,
:address1 => sign_on.bsadd1w1,
:address2 => sign_on.bsadd2w1,
:address3 => sign_on.bsadd3w1,
:city => sign_on.bscityw1,
:state => sign_on.bsstcdw1,
:zip => sign_on.bszipw1)
order.save
order
end
end
end
Related
Time frame for displaying user count is not working in Rails 4.2
I am having a dashboard which shows the user created / deleted count of today, yesterday, this week, this month etc; For this they wrote a condition in controller to get these counts and also scopes in model. The above scenario is working fine in Rails 3.2 but not working in Rails 4.2. This is my code: controller: protected def get_user_counts(conditions = {}) includes = [] if conditions.empty? # nothing elsif conditions.keys.first.include?("accounts.") includes = [:account] end result = [] [ {:label => 'today', :start => Time.zone.now.beginning_of_day, :end => Time.zone.now.end_of_day}, {:label => 'yesterday', :start => 1.days.ago.beginning_of_day, :end => 1.days.ago.end_of_day}, {:label => 'this week', :start => Time.zone.now.beginning_of_week, :end => Time.zone.now.end_of_week}, {:label => 'last week', :start => 7.days.ago(Time.zone.now.beginning_of_week), :end => 7.days.ago(Time.zone.now.end_of_week)}, {:label => 'this month', :start => Time.zone.now.beginning_of_month, :end => Time.zone.now.end_of_month}, {:label => 'last month', :start => Time.zone.now.prev_month.beginning_of_month, :end => Time.zone.now.prev_month.end_of_month}, ].each do |time_frame| result << [time_frame[:label], User.includes(includes).where(conditions).only_deleted.deleted_between(time_frame[:start], time_frame[:end]).count, User.includes(includes).where(conditions).with_deleted.created_between(time_frame[:start], time_frame[:end]).count] end return result end model: scope :created_between, lambda { |start_at, end_at| { :conditions => {'users.created_at' => (start_at..end_at)} } } scope :deleted_between, lambda { |start_at, end_at| # Don't forget to use 'count_only_deleted' or 'find_only_deleted' in combination # with this, or you'll always return zero users. :with_deleted and :only_deleted # keys do not work in named_scope. { :conditions => {'users.deleted_at' => (start_at..end_at)} } } Is there any wrong in my code or need any modifications, especially in model scope? Please help.
Problem is with scopes.Eager loading of scopes in Rails 4 has been restricted. You can change your scope like this : scope :created_between, -> (start_at, end_at) { where(created_at: (start_at..end_at)) }
How to consolidate these many rake tasks into one task
The application I'm working on runs import tasks each night to get information from an external database and processes and writes it to the local PostgreSQL database. This is so it can be viewed in our application. We do the following: Create a connection to the external database Perform some currency conversion Do some calculations on the data based on the average Check if the item already exists and update if it's changed Also check to see how it is classified and change the category to fit our categorisations Create the item if it does not exist All of this data is on different tables in the external database, so I've created a task for each table (about 30), but I am repeating myself excessively so looking for some guidance on how to DRY this bad boy up. Is it possible to create some kind of loop on a collection of the external database table names? I've tried this a couple of times but haven't had any success. Please find the code below of examples of two different import scripts. 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
This indeed look repetitive, why can't you come up with a Structure like this and not put everything in below format . ├── Rakefile └── models ├── import.rb └── old_db.rb I did similar kind of thing, for one of my project where i am extracting data from a DB, you can also refer to it here https://github.com/ankit8898/sql-server-mapper
Error "No Method" when using delayed job
I'm trying to import 90k lines of xml into my ruby app. herokus timeout limit is 30s so i'm trying to use delayed job. The import class works wonderfully in around 48-hippopotomuses locally. When i add the line handle_asynchronously :save_races I get the error "undefined method save_races' for classXmltube'" What am i doing wrong with DJ and how can i get this to work? Full class code below require "rexml/document" class Xmltube def self.convert_save(xml_data) doc = REXML::Document.new xml_data.read doc.elements.each("Meeting") do |meeting_element| meeting = save_meeting(meeting_element) save_races(meeting_element, meeting) Rails.logger.info "all done" end end def self.save_races(meeting_element, meeting) meeting_element.elements.each("Races/Race") do |race_element| race = save_race(race_element, meeting) save_race_entrants(race_element, race) end end def self.save_race_entrants(race_element, race) race_element.elements.each("RaceEntries/RaceEntry") do |entry_element| horse = save_horse(entry_element) jockey = save_jockey(entry_element) start = save_start(entry_element, horse, jockey, race) save_sumaries(entry_element, start) end end def self.save_track(meeting_element) # there is only one track, but still, each? wtf. t = {} meeting_element.elements.each("Track") do |track| t = { :name => track.attributes["VenueName"], :track_code => track.attributes["VenueCode"], :condition => track.elements['TrackRating'].text, :club_id => save_club(meeting_element.elements["Club"]).id } end track = Track.where(:track_code => t[:track_code] ).first if track Track.update(track.id, t) else Track.create(t) end end def self.save_meeting meeting_element t = { :meet_code => meeting_element.attributes['MeetCode'], :stage => meeting_element.elements["MeetingStage"].text, :phase => meeting_element.elements["MeetingPhase"].text, :nominations_close_at => meeting_element.elements["NominationsClose"].text, :acceptance_close_at => meeting_element.elements["AcceptanceClose"].text, :riders_close_at => meeting_element.elements["RidersClose"].text, :weights_published_at => meeting_element.elements["WeightsPublishing"].text, :club_id => save_club(meeting_element.elements["Club"]).id , :track_id => save_track(meeting_element).id, :tab_status => meeting_element.elements["TabStatus"].text, :state => meeting_element.elements["StateDesc"].text, :day_night => meeting_element.elements["DayNight"].text, :number_of_races => meeting_element.elements["NumOfRaces"].text, :meet_date => meeting_element.elements["MeetDate"].text, } meeting = Meeting.where(:meet_code => t[:meet_code] ).first if meeting Meeting.update(meeting.id, t) else Meeting.create(t) end end ############################################################ def self.save_sumaries entry_element, start entry_element.elements.each('Form/ResultsSummaries/ResultsSummary') do | element | s = { :name => element.attributes['Name'], :start_id => start.id, :starts => element.attributes['Starts'], :wins => element.attributes['Wins'], :seconds => element.attributes['Seconds'], :thirds => element.attributes['Thirds'], :prize_money => element.attributes['PrizeMoney'], } sum = Summary.where(:name => s[:name] ).where(:start_id => s[:start_id]).first if sum Summary.update(sum.id, s) else Summary.create(s) end end end def self.save_start entry_element, horse, jockey, race s = { :horse_id => horse.id, :jockey_id => jockey.id, :race_id => race.id, :silk => entry_element.elements["JockeySilksImage"].attributes["FileName_NoExt"], :start_code => entry_element.attributes['RaceEntryCode'], :handicap_weight => entry_element.elements['HandicapWeight'].text, } # Rails.logger.info entry_element['HandicapWeight'].text start = Start.where(:start_code => s[:start_code] ).first if start Start.update(start.id, s) else Start.create(s) end end def self.save_jockey entry_element j={ :name => entry_element.elements['JockeyRaceEntry/Name'].text, :jockey_code => entry_element.elements['JockeyRaceEntry'].attributes["JockeyCode"], } jockey = Jockey.where(:jockey_code => j[:jockey_code] ).first if jockey Jockey.update(jockey.id, j) else Jockey.create(j) end end def self.save_horse entry_element trainer = save_trainer entry_element h= { :name => entry_element.elements['Horse'].attributes["HorseName"], :color => entry_element.elements['Horse'].attributes["Colour"], :dob => entry_element.elements['Horse'].attributes["FoalDate"], :sex => entry_element.elements['Horse'].attributes["Sex"], :trainer_id => trainer.id, :horse_code => entry_element.elements['Horse'].attributes["HorseCode"], } horse = Horse.where(:horse_code => h[:horse_code] ).first if horse Horse.update(horse.id, h) else Horse.create(h) end end def self.save_trainer entry_element t= { :name => entry_element.elements['Trainer/Name'].text, :trainer_code => entry_element.elements['Trainer'].attributes["TrainerCode"] } trainer = Trainer.where(:trainer_code => t[:trainer_code] ).first if trainer Trainer.update(trainer.id, t) else Trainer.create(t) end end def self.save_club element t = {} t = { :club_code => element.attributes['ClubCode'], :title => element.attributes["Title"], } club = Club.where(:club_code => t[:club_code] ).first if club Club.update(club.id, t) else Club.create(t) end end def self.save_race element, meeting r = { :name => element.elements['NameRaceFull'].text, :occur => element.elements['RaceStartTime'].attributes["TimeAtVenue"], :distance => element.elements['RaceDistance'].text, :race_type => element.elements['RaceType'].text, :track_id => meeting.track_id, :race_code => element.attributes["RaceCode"], :meeting_id => meeting.id } race = Race.where(:race_code => r[:race_code] ).first if race Race.update(race.id, r) else Race.create(r) end end handle_asynchronously :save_races end
Since your save_races is a class method, you should call handle_asynchronously on Xmltube's singleton class: class << self handle_asynchronously :save_races end
This just worked as I would expect class Foo def self.bar(s) Rails.logger.info "From Foo.bar('#{s}')" end end # then ... Foo.delay.bar('hello') I was running 4.0.4 of DJ with ruby 2.1
rails controller stream
Hi i have a controller in rails but it gives me an error ActiveRecord::StatementInvalid in StreamsController#front_page Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EPOCH FROM posts.created_at) - 1327654606)/9000) desc LIMIT 15' at line 1: SELECT `posts`.* FROM `posts` WHERE ((`posts`.`featured` = 1 OR `posts`.`author_id` = 5)) ORDER BY (ln( 1 + posts.likes_count) + (EXTRACT(EPOCH FROM posts.created_at) - 1327654606)/9000) desc LIMIT 15 The StreamsController#front_page are: def front_page stream_responder do #stream = Stream::FrontPage.new(current_user, params[:offset]) #stream_json = PostPresenter.collection_json(#stream.stream_posts, current_user, lite?: true, include_root: false) end end And PostPresenter require File.join(File.dirname(__FILE__), '..', '..', 'lib', 'template_picker') class PostPresenter include ActionView::Helpers::TextHelper attr_accessor :post, :current_user def initialize(post, current_user=nil) #post = post #current_user = current_user #person = #current_user.try(:person) end def self.collection_json(collection, current_user, opts={}) collection.includes(:author => :profile).map {|post| self.new(post, current_user).as_json(opts)} end def as_json(options={}) { :id => #post.id, :guid => #post.guid, :text => #post.raw_message, :plain_text => #post.plain_text, :public => #post.public, :featured => #post.featured, :created_at => #post.created_at, :staff_picked_at => #post.staff_picked_at, :interacted_at => #post.interacted_at, :tags => #post.tags.as_json, :tag_list => #post.tags.map(&:name).join(", "), :post_type => #post.post_type, :image_url => #post.image_url, :object_url => #post.object_url, :favorite => #post.favorite, :nsfw => #post.nsfw, :author => PersonPresenter.new(#post.author, current_user), :o_embed_cache => #post.o_embed_cache.try(:as_api_response, :backbone), :mentioned_people => [], :photos => #post.photos.map {|p| p.as_api_response(:backbone)}, :frame_name => #post.frame_name || template_name, :parent => (options.fetch(:include_root, true) ? parent(options) : nil), :title => title, :next_post => next_post_path, :previous_post => previous_post_path, :screenshot_url => #post.screenshot_url, :screenshot_width => #post.screenshot_width, :screenshot_height => #post.screenshot_height, :show_screenshot => self.show_screenshot?, :has_gif => self.has_gif?, :conversation_id => #post.conversation_id, :interactions => options.fetch(:lite?, false) ? lite_interactions : heavy_interactions, :original => #post.original? } end def next_post_path Rails.application.routes.url_helpers.next_post_path(#post) end def previous_post_path Rails.application.routes.url_helpers.previous_post_path(#post) end def heavy_interactions PostInteractionPresenter.new(#post, current_user).as_json end def lite_interactions PostInteractionPresenter::Lite.new(#post, current_user).as_json end def title #post.text.present? ? truncate(#post.plain_text, :length => 118) : I18n.translate('posts.presenter.title', :name => #post.author.name) end def template_name #kill me, lol, I should be client side #template_name ||= TemplatePicker.new(#post).template_name end def parent(opts={}) PostPresenter.new(#post.parent, current_user).as_json({:include_root => false}.merge(opts)) if #post.respond_to?(:parent) && #post.parent.present? end def show_screenshot? #post.screenshot_url.present? end def has_gif? return false unless #post.photos.present? return 'gif' if #post.photos.detect{ |p| p.url && p.url.match(".gif") }.present? end protected def person #current_user.person end def user_signed_in? #current_user.present? end end I dont know where am i do wrong..? badly need help on this
You're closing an unopened parenthesis in the query. 'EPOCH FROM posts.created_at) ...'
How to get gateway response from model into controller - Ruby on Rails
My application uses activemerchant to process payments. I'm using Eway as my payment gateway. I'm storing credit card details with Eway to keep them out of my application database. I'm using a method store which returns a response with a customer billing id that I can use at a later time to process the order. http://rdoc.info/github/Shopify/active_merchant/master/ActiveMerchant/Billing/EwayManagedGateway My main issue is how do I get the response value into my controller so I can save it to the member model. I've created a simple ruby file to test this all works and it does. I just need to convert this code to work inside my rails app. require "rubygems" gem 'activemerchant', '1.15.0' require 'activemerchant' ActiveMerchant::Billing::Base.mode = :production gateway = ActiveMerchant::Billing::EwayManagedGateway.new( :login => '12345678', :username => 'mylogin#example.com', :password => 'mypassword' ) credit_card = ActiveMerchant::Billing::CreditCard.new( :type => "visa", :number => "4444333322221111", :verification_value => "123", :month => "11", :year => "2011", :first_name => "John", :last_name => "Citizen" ) options = { :order_id => '1230123', :ip => "127.0.0.1", :email => 'john.citizen#example.com', :billing_address => { :title => "Mr.", :address1 => '123 Sample Street', :city => 'Sampleville', :state => 'NSW', :country => 'AU', :zip => '2000' }, :description => 'purchased items' } if credit_card.valid? response = gateway.store(credit_card, options) if response.success? puts "Credit Card Stored. #{response.message}" customer = response.params['CreateCustomerResult'] puts "Customer Id: #{customer}" else puts "Error: #{response.message}" end else puts "Error, credit card is not valid. #{credit_card.errors.full_messages.join('. ')}" end Here is the relevant code in my order model. serialize :params cattr_accessor :gateway def response=(response) self.success = response.success? self.message = response.message self.params = response.params self.billing_id = response.params['CreateCustomerResult'] rescue ActiveMerchant::ActiveMerchantError => e self.success = false self.message = e.message self.params = {} self.billing_id = nil end def store response = Order.gateway.store(credit_card, options) end Here is my order controller create code. def create #member = current_member #order_deal = Deal.find(params[:deal_id]) #order = #order_deal.orders.build(params[:order]) #order.member_id = current_member.id #order.ip_address = request.remote_ip #deal = #order_deal if #order.save if #order.store render :action => "success" flash[:notice] = "Successfully processed your order." else render :action => "new" end else render :action => 'new' end end So essentially I want to get the response.params['CreateCustomerResult'] and add it to my member model under member.billing_id = response.params['CreateCustomerResult] How can I do this?