Commit f732951
app/models/gym.rb
@@ -61,7 +61,8 @@ class Gym < ActiveRecord::Base
end
def self.import(city, pages: 5)
- return if Rails.env.test? || city.blank?
+ return if city.blank?
+ return [] if Rails.env.test?
(1..pages).each do |page|
Gym.search_yelp(q: 'gym', city: city, page: page).each(&:save!)
end
app/models/search.rb
@@ -1,18 +1,50 @@
class Search
- def self.yelp(q, categories = [], city, page, per_page, &block)
- key = "#{q}-#{city}-#{page}-#{per_page}"
- Rails.cache.fetch(key, expires_in: 1.hour) do
- city = city.present? ? city : "Calgary"
- categories = categories.present? ? categories.join(",") : "fitness"
- offset = (page * per_page) - per_page
- Kaminari.paginate_array(
- Yelp.client.search(city, {
- category_filter: categories,
- limit: per_page,
- offset: offset,
- term: q,
- }).businesses.map(&block)
- )
+ class Yelp
+ attr_reader :client
+
+ def initialize(client = ::Yelp.client)
+ @client = client
+ end
+
+ def search(q, categories = [], city, page, per_page, &block)
+ return [] if city.blank?
+
+ cache(key: key_for(q, city, page, per_page)) do
+ paginate(results_for(q, city, categories, page, per_page).map(&block))
+ end
+ end
+
+ private
+
+ def key_for(*args)
+ args.join('-')
+ end
+
+ def results_for(q, city, categories, page, per_page)
+ client.search(city, {
+ category_filter: categories.join(","),
+ limit: per_page,
+ offset: offset_for(page, per_page),
+ term: q,
+ }).businesses
+ end
+
+ def paginate(results)
+ Kaminari.paginate_array(results)
end
+
+ def cache(key:)
+ Rails.cache.fetch(key, expires_in: 1.hour) do
+ yield
+ end
+ end
+
+ def offset_for(page, per_page)
+ (page * per_page) - per_page
+ end
+ end
+
+ def self.yelp(q, categories = [], city, page, per_page, &block)
+ Yelp.new.search(q, categories, city, page, per_page, &block)
end
end