2011-08-18 36 views
0

我有一个Rails 3应用程序正在工作。我有3个模型:用户,场地和评分。Postgres,Rails和GROUP

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 

我需要通过居委会分组的所有场馆,名称邻里组中所有场馆的平均评分,n中所有场馆的评分总数eighborhood组,邻域组中所有场馆的平均纬度以及邻域组中所有场馆的平均经度。

我不太清楚如何使用ActiveRecord和Postgres来完成任何建议?

回答

0

这是我已经做了,使其工作;不过,我觉得他们可能是一个更有效的方式来运行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