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:
authored and GitHub committed 2026-09-20 13:30:42 +09:30
1 parent f65e715ef3
commit 4d87d9ccb9
4 files changed
+52 -10

No files matched your search

+7 -6
View File
@@ -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
+5 -4
View File
@@ -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
+11
View File
@@ -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