Postgres, Rails и GROUP - PullRequest
       4

Postgres, Rails и GROUP

0 голосов
/ 19 августа 2011

У меня есть приложение на Rails 3, над которым я работаю. У меня есть 3 модели: пользователь, место и рейтинг.

User.rb:

# attributes:
# name, email => String
class User < ActiveRecord::Base
    has_many :ratings
    has_many :venues, :through => :ratings, :uniq => true
    ...
end

Venue.rb:

# attributes: 
# name, address, city, state, zip, neighborhood => String
# latitude, longitude => Float
class Venue < ActiveRecord::Base
    has_many :ratings
    has_many :users
    ...

    def average_rating
      sum = 0
      self.ratings.each do |rating|
         sum += rating.value
      end
      sum.to_f / self.number_of_ratings.to_f
    end

    def number_of_ratings
      self.ratings.count
    end
end

Rating.rb:

# attributes: 
# venue_id, user_id => Integer
# value => String
class Rating < ActiveRecord::Base
    belongs_to :user
    belongs_to :venue
    ...
end

Мне нужно, чтобы все объекты были сгруппированы по районам с указанием названия района, среднего рейтинга для всех объектов в группе соседей, общего количества оценок для всех объектов в группе соседей, средней широты всех объектов. в группе соседей и средняя долгота всех мест в группе соседей.

Я не совсем уверен, как туда добраться, используя ActiveRecord и Postgres, какие-либо предложения?

Ответы [ 2 ]

0 голосов
/ 22 августа 2011

Это то, что я сделал, чтобы это работало; тем не менее, я чувствую, что их может быть более эффективный способ выполнить запрос postres и группировать по соседству, но мне не повезло в выяснении этого.

neighborhoods = @venues.select('DISTINCT(venues.neighborhood)').map(&:neighborhood)
neighborhoods.each do |neighborhood|
    venues_in_neighborhood = @venues.where(:neighborhood => neighborhood).includes(:ratings)
    avg_rating = venues_in_neighborhood.average('ratings.value').to_f        
    number_of_ratings = Rating.includes(:venue).where('venues.neighborhood' => neighborhood).count
    avg_latitude = venues_in_neighborhood.average('latitude').to_f
    avg_longitude = venues_in_neighborhood.average('longitude').to_f

    @response << {:name => neighborhood, 
                  :latitude => avg_latitude, 
                  :longitude => avg_longitude, 
                  :rating => avg_rating,
                  :numberOfRatings => number_of_ratings}
end
0 голосов
/ 19 августа 2011

Вот мои предложения:

Рассмотрим http://geokit.rubyforge.org/ Это позволит вам делать "искатели на основе расстояний ActiveRecord. Например, вы можете найти все точки в вашей базе данных в пределах 50-радиус мили. "Я думаю, это ваш район.

Во-вторых, я бы использовал представление Postgresql для целей производительности и сбора данных.Вот ссылка на документы: http://developer.postgresql.org/pgdocs/postgres/sql-createview.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...