Найти пользователей в определенном месте, запрашивая их последнее местоположение обновления статуса - PullRequest
2 голосов
/ 14 марта 2011

Я работаю над приложением Rails, которое очень похоже на Twitter, которое используется для отслеживания членов команд и их обновленного статуса с помощью обновлений статуса, называемых «пингами».Твиттер называет эти статусы «твитами».

Суть приложения такова:

Сотрудник (: first_name,: last_name)
Ping (: datetime,: status,: latitude,: долгота)

Модель сотрудника:

class Employee < ActiveRecord::Base
  has_many :pings
  has_one  :ping, :order => "created_at DESC" # Returns the lastest Ping (employee.ping)
end

Модель пинга:

class Ping < ActiveRecord::Base
  belongs_to :employee
  acts_as_mappable  :default_units => :miles,
                    :default_formula => :sphere,
                    :distance_field_name => :distance,
                    :lat_column_name => :latitude,
                    :lng_column_name => :longitude
end

Мне нужно запросить у всех сотрудников последний пингпо текущему местоположению.Проблема в том, что я не знаю, как это сделать.

Если я ищу все пинги в текущем местоположении, я получаю несколько пингов, принадлежащих сотруднику.Затем мне нужно будет сравнить каждый ping.id с employee.ping.id , чтобы увидеть, является ли один из них ПИШЕННЫМ пингом сотрудника.

Я могуне выполняйте поиск сотрудником, поскольку информация о географическом местоположении находится в объекте Ping.И единственные пинги, которые меня волнуют, это последние.

Ping Controller

  def location
    pings = Ping.geo_scope(:within => params[:distance], :origin => [params[:latitude], params[:longitude]])
    render :json => pings, :include => :employee, :only => [:id, :first_name, :last_name, :status, :longitude, :latitude]
    # this returns all Pings that were ever created in this location.
  end

Спасибо за любые отзывы и помощь!

Спасибо, Робин, за помощь.Вы вдохновили меня придумать следующее:

employees = Employee.all

current_pings = []    
employees.each do |employee|
  current_pings << employee.ping.id
end

pings = Ping.geo_scope(:within => params[:distance], :origin => [params[:latitude], params[:longitude]]).find_all_by_id(current_pings)

render :json => pings, :include => :employee, :only => [:id, :first_name, :last_name, :status, :longitude, :latitude, :created_at]

1 Ответ

0 голосов
/ 15 марта 2011

Это не проверено, но я предлагаю использовать метод Rails group_by, чтобы вы могли сгруппировать все эхо-запросы по employee_id (отсортировано по созданному в) и затем выполнить итерацию по коллекции, возвращая ключ (employee_id) и первый значение в массиве (самый последний пинг для этого сотрудника).

hash = Hash.new
pings.group_by(&:employee_id).order('created_at DESC').each do |k,v|
  hash[k] = v
end
render :json => hash

Может потребоваться некоторая настройка, чтобы получить точные данные о каждом сотруднике, которые вам нужны, но в принципе должны работать.

Robin

...