mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-09-28 08:54:58 -04:00
Optimize places memory usage by paginating, plucking fields, and limiting nearest_to (#4792)
Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: Brenda Wallace <brenda@wallace.net.nz>
This commit is contained in:
4 files changed
+52
-10
No files matched your search
@@ -4,14 +4,17 @@ class PlacesController < ApplicationController
|
||||
skip_authorize_resource
|
||||
respond_to :html, :json
|
||||
|
||||
MEMBER_FIELDS = %i[id login_name slug location latitude longitude].freeze
|
||||
|
||||
def index
|
||||
respond_to do |format|
|
||||
format.html
|
||||
# json response is whatever we want to map here
|
||||
format.json do
|
||||
render json: Member.located.to_json(only: %i(
|
||||
id login_name slug location latitude longitude
|
||||
))
|
||||
members = Member.located.paginate(page: params[:page]).pluck(*MEMBER_FIELDS).map do |row|
|
||||
MEMBER_FIELDS.zip(row).to_h
|
||||
end
|
||||
render json: members
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -24,9 +27,7 @@ class PlacesController < ApplicationController
|
||||
respond_to do |format|
|
||||
format.html # show.html.haml
|
||||
format.json do
|
||||
render json: @nearby_members.to_json(only: %i(
|
||||
id login_name slug location latitude longitude
|
||||
))
|
||||
render json: @nearby_members.as_json(only: MEMBER_FIELDS)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -173,13 +173,14 @@ class Member < ApplicationRecord
|
||||
where(["lower(login_name) = :value", { value: login.downcase }])
|
||||
end
|
||||
|
||||
def self.nearest_to(place)
|
||||
return [] if place.blank?
|
||||
def self.nearest_to(place, limit = 50)
|
||||
return Member.none if place.blank?
|
||||
|
||||
latitude, longitude = Geocoder.coordinates(place, params: { limit: 1 })
|
||||
return [] unless latitude && longitude
|
||||
return Member.none unless latitude && longitude
|
||||
|
||||
Member.located.near([latitude, longitude], 1000)
|
||||
relation = Member.located.near([latitude, longitude], 1000)
|
||||
limit ? relation.limit(limit) : relation
|
||||
end
|
||||
|
||||
def already_following?(member)
|
||||
|
||||
@@ -7,6 +7,26 @@ describe PlacesController do
|
||||
controller.stub(:current_member) { nil }
|
||||
end
|
||||
|
||||
describe "GET index" do
|
||||
before do
|
||||
@london_member = create(:london_member)
|
||||
end
|
||||
|
||||
it "renders the index template for HTML request" do
|
||||
get :index
|
||||
response.should render_template(:index)
|
||||
end
|
||||
|
||||
it "returns JSON with paginated located members" do
|
||||
get :index, format: :json
|
||||
response.should be_successful
|
||||
json = JSON.parse(response.body)
|
||||
expect(json).to be_an(Array)
|
||||
expect(json.first["login_name"]).to eq(@london_member.login_name)
|
||||
expect(json.first.keys).to match_array(%w(id login_name slug location latitude longitude))
|
||||
end
|
||||
end
|
||||
|
||||
describe "GET show" do
|
||||
before do
|
||||
@london_member = create(:london_member)
|
||||
@@ -22,6 +42,15 @@ describe PlacesController do
|
||||
get :show, params: { place: @london_member.location }
|
||||
assigns(:nearby_members).should eq [@london_member, @edinburgh_member]
|
||||
end
|
||||
|
||||
it "returns JSON with nearby members" do
|
||||
get :show, params: { place: @london_member.location }, format: :json
|
||||
response.should be_successful
|
||||
json = JSON.parse(response.body)
|
||||
expect(json).to be_an(Array)
|
||||
expect(json.map { |m| m["login_name"] }).to eq([@london_member.login_name, @edinburgh_member.login_name])
|
||||
expect(json.first.keys).to match_array(%w(id login_name slug location latitude longitude))
|
||||
end
|
||||
end
|
||||
|
||||
describe "GET search" do
|
||||
|
||||
@@ -250,6 +250,17 @@ describe Member do
|
||||
london_member = create(:london_member)
|
||||
Member.nearest_to('Greenwich, UK').should eq [london_member, edinburgh_member]
|
||||
end
|
||||
|
||||
it 'returns Member.none when place is blank or un-geocoded' do
|
||||
expect(Member.nearest_to('')).to eq Member.none
|
||||
expect(Member.nearest_to(nil)).to eq Member.none
|
||||
end
|
||||
|
||||
it 'respects the limit parameter' do
|
||||
create(:edinburgh_member)
|
||||
create(:london_member)
|
||||
expect(Member.nearest_to('Greenwich, UK', 1).to_a.size).to eq 1
|
||||
end
|
||||
end
|
||||
|
||||
describe 'interesting scope' do
|
||||
|
||||
Reference in new issue
Block a user