Commit 148f59aa by Tô Ngọc Ánh

Refactor code to improve performance

parent 6292354d
Pipeline #776 failed with stages
in 0 seconds
...@@ -3,7 +3,7 @@ class HomeController < ApplicationController ...@@ -3,7 +3,7 @@ class HomeController < ApplicationController
@total_jobs = Job.count @total_jobs = Job.count
@locations = Location.select(:id, :city) @locations = Location.select(:id, :city)
@industries = Industry.select(:id, :name) @industries = Industry.select(:id, :name)
@jobs = Job.order(created_at: :desc).limit(Job::NUMBER_LATEST_JOB) @jobs = Job.includes(:company, :locations).order(created_at: :desc).limit(Job::NUMBER_LATEST_JOB)
@top_cities = Location.top_locations(9) @top_cities = Location.top_locations(9)
@top_industries = Industry.top_industries(9) @top_industries = Industry.top_industries(9)
end end
......
class LocationsController < ApplicationController class LocationsController < ApplicationController
def index def index
@vn_cities_lists = Location.vietnam @vn_cities_lists = Location.vietnam.count_job
@internal_cities_lists = Location.international @internal_cities_lists = Location.international.count_job
end end
end end
class Industry < ApplicationRecord class Industry < ApplicationRecord
scope :top_industries, ->(number) { joins(:jobs) scope :count_job, -> { joins(:jobs).group(:industry_id).select('industries.*, count(jobs.id) as job_count') }
.group(:industry_id) scope :top_industries, ->(number) { count_job.order(Arel.sql('count(jobs.id) DESC')).limit(number) }
.order(Arel.sql('count(jobs.id) DESC'))
.take(number) }
has_and_belongs_to_many :jobs has_and_belongs_to_many :jobs
end end
class Location < ApplicationRecord class Location < ApplicationRecord
scope :top_locations, ->(number) { joins(:jobs) scope :count_job, -> { joins(:jobs).group(:location_id).select('locations.*, count(jobs.id) as job_count') }
.group(:location_id) scope :top_locations, ->(number) { count_job.order(Arel.sql('job_count DESC')).limit(number) }
.order(Arel.sql('count(jobs.id) DESC')) scope :international, -> { where(oversea: true) }
.take(number) } scope :vietnam, -> { where(oversea: false) }
scope :international, ->{ where(oversea: true) }
scope :vietnam, ->{ where(oversea: false) }
CITY_VIETNAM_NUMBER = 70 CITY_VIETNAM_NUMBER = 70
has_many :locations_jobs has_many :locations_jobs
......
<% if industry.jobs.size.positive? %>
<div class='col-4 my-2'> <div class='col-4 my-2'>
<div class='card'> <div class='card'>
<%= link_to '#', class: 'card-body text-decoration-none' do %> <%= link_to '#', class: 'card-body text-decoration-none' do %>
<h5 class='card-title font-weight-bold'><%= industry.name %></h5> <h5 class='card-title font-weight-bold'><%= industry.name %></h5>
<p class='card-text'><%= industry.jobs.size %> Jobs</p> <p class='card-text'><%= industry.job_count %> Jobs</p>
<% end %> <% end %>
</div> </div>
</div> </div>
<% end %>
<% if location.jobs.size.positive? %>
<div class='col-4 my-2'> <div class='col-4 my-2'>
<div class='card'> <div class='card'>
<%= link_to '#', class: 'card-body text-decoration-none' do %> <%= link_to '#', class: 'card-body text-decoration-none' do %>
<h5 class='card-title font-weight-bold'><%= location.city %></h5> <h5 class='card-title font-weight-bold'><%= location.city %></h5>
<p class='card-text'><%= location.jobs.size %> Jobs</p> <p class='card-text'><%= location.job_count %> Jobs</p>
<% end %> <% end %>
</div> </div>
</div> </div>
<% end %> \ No newline at end of file
...@@ -4,11 +4,11 @@ ...@@ -4,11 +4,11 @@
<ul class='list-group list-group-horizontal'> <ul class='list-group list-group-horizontal'>
<li class='list-group-item'> <li class='list-group-item'>
<a href='#vietnam'>Việt Nam</a> <a href='#vietnam'>Việt Nam</a>
<span class='badge badge-primary badge-pill'><%= @vn_cities_lists.size %></span> <span class='badge badge-primary badge-pill'><%= @vn_cities_lists.length %></span>
</li> </li>
<li class='list-group-item'> <li class='list-group-item'>
<a href='#international'>International</a> <a href='#international'>International</a>
<span class='badge badge-primary badge-pill'><%= @internal_cities_lists.size %></span> <span class='badge badge-primary badge-pill'><%= @internal_cities_lists.length %></span>
</li> </li>
</ul> </ul>
</div> </div>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment