Commit 31dc3481 by Son Do Hong

Merge branch 'feature/count_jobs' into 'master'

Feature/count jobs based on city/industry

See merge request !13
parents 98be312e b565e7d0
class StaticPagesController < ApplicationController class TopsController < ApplicationController
def index def index
@vn_cities = City.vn_cities @vn_cities = City.city_order.take(Settings.top.city.limit)
@industries = Industry.all @industries = Industry.all
@jobs = Job.page(params[:page]).per(Settings.job.per_page) @jobs = Job.page(params[:page]).per(Settings.job.per_page)
end end
......
...@@ -14,6 +14,17 @@ ...@@ -14,6 +14,17 @@
# #
class City < ApplicationRecord class City < ApplicationRecord
has_many :city_jobs
has_many :jobs, through: :city_jobs
scope :vn_cities, -> {where region: "Việt Nam"} scope :vn_cities, -> {where region: "Việt Nam"}
scope :inter_cities, -> {where region: "#"} scope :inter_cities, -> {where region: "#"}
def job_count
@job_count ||= jobs.count
end
def self.city_order
@city_order ||= all.sort_by(&:job_count).reverse
end
end end
...@@ -13,4 +13,6 @@ ...@@ -13,4 +13,6 @@
# #
class Industry < ApplicationRecord class Industry < ApplicationRecord
has_many :industry_jobs
has_many :jobs, through: :industry_jobs
end end
...@@ -30,4 +30,10 @@ ...@@ -30,4 +30,10 @@
class Job < ApplicationRecord class Job < ApplicationRecord
belongs_to :company belongs_to :company
has_many :city_jobs
has_many :cities, through: :city_jobs
has_many :industry_jobs
has_many :industries, through: :industry_jobs
end end
require "csv" require "csv"
class Import class Import
def initialize
end
def import def import
cities = [] cities = []
companies = [] companies = []
industries = [] industries = []
jobs = []
city_columns = [:name, :region] city_columns = [:name, :region]
company_columns = [:name, :email, :address, :code] company_columns = [:name, :email, :address, :code]
industry_columns = [:name] industry_columns = [:name]
job_columns = [:title, :level, :salary, :description, :short_des,
:requirement, :category, :company_id]
join_jobs = []
CSV.foreach(Rails.root.join("lib", "jobss.csv"), headers: true) do |row| file_path = Settings.csv.file_path
CSV.foreach(Rails.root.join("lib", file_path), headers: true) do |row|
cities << {name: row["company province"], region: "Việt Nam"} cities << {name: row["company province"], region: "Việt Nam"}
companies << {name: row["company name"], email: row["contact email"], companies << {name: row["company name"], email: row["contact email"],
address: row["company address"], code: row["company id"]} address: row["company address"], code: row["company id"]}
industries << {name: row["category"]} industries << {name: row["category"]}
job_csv = JobCsv.new(row)
jobs << job_csv.csv_attributes
join_jobs << [row["company province"], row["category"], job_csv.title, job_csv.company_id]
rescue
error = ActiveSupport::Logger.new("log/errors.log")
error.info "These row have been skipped: #{row}"
next
end end
City.import city_columns, cities, on_duplicate_key_ignore: true cities_import(city_columns, cities)
puts "Cities imported" industries_import(industry_columns, industries)
companies_import(company_columns, companies)
jobs_import(job_columns, jobs)
join_jobs_import(join_jobs)
end
Company.import company_columns, companies, on_duplicate_key_ignore: true def cities_import(col_arr, arr)
puts "Companies imported" return if col_arr.blank?
City.import col_arr, arr, on_duplicate_key_ignore: true
end
def industries_import(col_arr, arr)
return if col_arr.blank?
Industry.import col_arr, arr, on_duplicate_key_ignore: true
end
def companies_import(col_arr, arr)
return if col_arr.blank?
Company.import col_arr, arr, on_duplicate_key_ignore: true
end
def jobs_import(col_arr, arr)
return if col_arr.blank?
Job.import col_arr, arr
end
Industry.import industry_columns, industries, on_duplicate_key_ignore: true def join_jobs_import(param)
puts "Industries imported" param.each do |city_name,industry_name, job_title, company_id|
job = Job.find_by(title: job_title, company_id: company_id)
city = City.find_by(name: city_name)
job.city_jobs.create(city_id: city.id)
industry = Industry.find_by(name: industry_name)
job.industry_jobs.create(industry_id: industry.id)
end
end end
end end
require "csv"
class JobsImport
def import_job
jobs = []
job_columns = [:title, :level, :salary, :description, :short_des,
:requirement, :category, :company_id]
CSV.foreach(Rails.root.join("lib", "jobss.csv"), headers: true) do |row|
jobs << JobCsv.new(row).csv_attributes
end
Job.import job_columns, jobs
puts "Jobs imported"
end
end
<div class="col-md-3"> <div class="col-md-3">
<div class="col-show"> <div class="col-show">
<%= city.name %> <%= city.name %> (<%= (city.job_count) %>)
</div> </div>
</div> </div>
<h3>Top cities</h3>
<div class="container">
<div class="row row-cols-4">
<%= render partial: "cities/city", collection: @vn_cities %>
</div>
<%= link_to "All cities", cities_path, class: "btn btn-lg btn-primary" %>
</div>
...@@ -17,13 +17,7 @@ ...@@ -17,13 +17,7 @@
</div> </div>
<div class="top_cities"> <div class="top_cities">
<h3>Top cities</h3> <%= render partial: "shared/top_cities" %>
<div class="container">
<div class="row row-cols-4">
<%= render partial: "cities/city", collection: @vn_cities %>
</div>
</div>
</div> </div>
<div class="top_industries"> <div class="top_industries">
......
...@@ -4,8 +4,7 @@ Rails.application.routes.draw do ...@@ -4,8 +4,7 @@ Rails.application.routes.draw do
resources :cities, only: :index resources :cities, only: :index
resources :jobs, only: :index resources :jobs, only: :index
devise_for :users devise_for :users
root "static_pages#index" root "tops#index"
get "static_pages/index"
namespace :users do namespace :users do
resource :my_page, only: :show resource :my_page, only: :show
end end
......
job: job:
per_page: 5 per_page: 5
csv:
file_path: "jobss.csv"
top:
city:
limit: 9
,nghiann,devops-OptiPlex-3020,02.12.2019 09:27,file:///home/nghiann/.config/libreoffice/4;
\ No newline at end of file
...@@ -2,6 +2,8 @@ namespace :task do ...@@ -2,6 +2,8 @@ namespace :task do
desc "import data" desc "import data"
task import: :environment do task import: :environment do
Import.new.import Import.new.import
JobsImport.new.import_job
import = ActiveSupport::Logger.new("log/import.log")
import.info "Cities, industries, companies, jobs imported succesful at #{Time.current}"
end end
end end
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