Ruby on Rails - Small activerecord and view rendering time yet big response time

299 Views Asked by At

I have a Ruby on Rails application that is working fine for most of the API requests but for some API requests it just hangs. ActiveRecord queries are made in small time and also view is rendered in small time as well but yet response time is very big.

Rails version is 4.2.5 and Ruby version is 2.2.0, Database that I am using is Postgresql. Below I am attaching my Gemfile and also production log and also the code for which this is happening.

Production.log

I, [2019-09-07T09:23:45.748270 #22745]  INFO -- : Started GET "/api/v3/restaurants/1/accepted_orders?skip_search=1" for
    165.228.89.233 at 2019-09-07 09:23:45 +0000 
I, [2019-09-07T09:23:45.753331 #22745]  INFO -- : Processing by Api::V3::Staff::OrdersController#accepted_index as JSON 
I, [2019-09-07T09:23:45.753387 #22745]  INFO -- :   Parameters: {"skip_search"=>"1", "id"=>"1"} 
D, [2019-09-07T09:23:45.756807 #22745] DEBUG -- :   User Load (2.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 6]] 
D, [2019-09-07T09:23:45.761643 #22745] DEBUG -- :   User Load (3.9ms)  SELECT  "users".* FROM "users" WHERE "users"."uid" = $1 LIMIT 1  [["uid", "[email protected]"]] 
D, [2019-09-07T09:23:45.765724 #22745] DEBUG -- :   Eula Load (3.1ms)  SELECT  "eulas".* FROM "eulas" WHERE "eulas"."is_latest" = $1 LIMIT 1  [["is_latest", "t"]] 
D, [2019-09-07T09:23:45.768793 #22745] DEBUG -- :   Privacy Load (2.7ms)  SELECT  "privacies".* FROM "privacies" WHERE "privacies"."is_latest" = $1 LIMIT 1  [["is_latest", "t"]] 
D, [2019-09-07T09:23:45.772602#22745] DEBUG -- :   Restaurant Load (3.0ms)  SELECT  "restaurants".* FROM "restaurants" WHERE "restaurants"."id" = $1 LIMIT 1  [["id", 1]] 
D, [2019-09-07T09:23:46.293350 #22745] DEBUG -- :   Order Load (519.6ms)  SELECT "orders".* FROM "orders" WHERE "orders"."restaurant_id" IN (1) 
D, [2019-09-07T10:44:50.564263 #22745] DEBUG -- :    (19.8ms)  SELECT COUNT(*) FROM "orders" WHERE "orders"."status" = $1 AND "orders"."restaurant_id" = 1 AND ( DATE(orders.created_at) >= '2019-09-07 09:45:50 UTC')  [["status", 1]] 
D, [2019-09-07T10:44:50.577108 #22745] DEBUG -- :    (11.7ms)  SELECT COUNT(*) FROM "orders" WHERE "orders"."status" = $1 AND "orders"."restaurant_id" = 1 AND ( DATE(orders.created_at) >= '2019-09-07 09:45:50 UTC')  [["status", 0]] 
D, [2019-09-07T10:44:50.580691 #22745] DEBUG -- :   User Exists (1.5ms)  SELECT  1 AS one FROM "users" WHERE ("users"."email" = '[email protected]' AND "users"."id" != 6) LIMIT 1 
D, [2019-09-07T10:44:50.582116 #22745] DEBUG -- :   User Exists (0.6ms)  SELECT  1 AS one FROM "users" WHERE ("users"."username" = 'Staff 1' AND "users"."id" != 6) LIMIT 1 
D, [2019-09-07T10:44:50.584594#22745] DEBUG -- :   User Exists (1.8ms)  SELECT  1 AS one FROM "users" WHERE ("users"."phone_number" = '+777777777' AND "users"."id" != 6) LIMIT 1 
I, [2019-09-07T10:44:50.586265 #22745] INFO -- : Completed 200 OK in 4864833ms (Views: 0.3ms | ActiveRecord:
        570.2ms)

Part of code having the error

api :GET, '/v3/restaurants/:id/accepted_orders', 'Returns all accepted orders of a restaurant (for staff and owners)'
param :id, String, desc: 'id of the restaurant', required: true
def accepted_index
  query = " DATE(orders.created_at) >= '#{59.minutes.ago}'" if current_user.staff?
  accepted = Order.where(status: Order.statuses[:accepted], restaurant: @restaurant).where(query)
  pending = Order.where(status: Order.statuses[:pending], restaurant: @restaurant).where(query)
  render json: {accepted_count: accepted.count, pending_count: pending.count}
end

Gemfile

source 'https://rubygems.org'
ruby '2.2.0'
gem 'rails', '4.2.5'
gem 'pg'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'jbuilder', '~> 2.0'
gem 'annotate'

gem 'activeadmin', github: 'activeadmin'
gem 'paper_trail', '~> 4.0.0'
gem 'dotenv-rails'
# MailChimp integration
gem 'gibbon'
gem 'google_directions'
gem 'geocoder'
gem 'stripe', :git => 'https://github.com/stripe/stripe-ruby'
# The push notification service.
gem 'rpush', github: 'rpush/rpush'
gem 'prawn-rails'
gem 'prawn-table'
gem 'active_admin_datetimepicker'
gem 'phony_rails'
gem 'closure_tree'
gem 'whenever', require: false
group :development, :test do
  gem 'byebug'
end
group :development do
  gem 'pry'
  gem 'web-console', '~> 2.0'
  gem 'spring'
  gem 'letter_opener'
end
gem 'apipie-rails'
gem 'devise'
gem 'high_voltage'
gem 'simple_form'
gem 'rack-cors', :require => 'rack/cors'
gem 'omniauth'
gem 'devise_token_auth'
gem 'sidekiq', '~> 4.0', '>= 4.0.1'
# gem 'ckeditor', '~> 4.1', '>= 4.1.5'
gem 'socket.io-client-simple'
gem 'houston'
gem 'fancybox-rails', '~> 0.3.0'
gem 'mini_magick', '~> 4.3', '>= 4.3.6'
gem 'carrierwave', '~> 0.10.0'
gem 'fog', '~> 1.36'
gem 'chosen-rails'
gem 'twilio-ruby', '~> 4.11.1'
group :development do
  gem 'better_errors'
  gem 'quiet_assets'
  gem 'rails_layout'
  gem 'spring-commands-rspec'
  gem 'capistrano', '~> 3.1.0'
  gem 'capistrano-bundler', '~> 1.1.2'
  gem 'capistrano-rails', '~> 1.1.1'
  gem 'capistrano-rvm', github: "capistrano/rvm"
  gem 'capistrano-sidekiq'
  gem 'rest-client'
end
group :development, :test do
  gem 'factory_girl_rails'
  gem 'faker'
  gem 'rspec'
  gem 'fakeredis'
  gem 'rspec-rails'
  gem 'shoulda-matchers', '~> 3.0'
  gem 'shoulda-callback-matchers', '~> 1.1.1'
  gem 'redis-namespace'
end
group :test do
  gem 'capybara'
  gem 'database_cleaner'
  gem 'launchy'
  gem 'selenium-webdriver'
end
gem 'sinatra', :require => nil

On production server I am using nginx and Passenger.

Thanks

0

There are 0 best solutions below