2015-04-01 71 views
0

我一直在尝试获得一个餐厅列表,以订购和显示在我的导轨应用程序中的平均评分和总计评论数量以降序排列。到目前为止,我能够正确地从数据库(psql)中收集和订购它们,但问题在于,没有任何评论或评级的餐馆没有显示在列表中(这意味着它们没有显示在前面结束)。这是我的模型:从表中按表的平均评级和评论数量排序,包括没有评级或评论的活动记录使用活动记录

class Restaurant < ActiveRecord::Base 
    belongs_to :user 
    has_many :reviews, dependent: :destroy 
    validates :name, length: {minimum: 3}, uniqueness: true 
end 

class Review < ActiveRecord::Base 
belongs_to :restaurant 
belongs_to :user 
validates :rating, presence: true, inclusion: (1..5) 
end 

这里是餐馆控制器从数据库中请求数据的代码:

def index 
    if params[:search] 
    @restaurants = Restaurant.search(params[:search]).order("created_at DESC") 
    else 
    @restaurants =Restaurant.joins(:reviews).group("restaurants.id").order("AVG(reviews.rating) DESC") 
end 
end 

我清楚地失去了一些东西,但我不知道是什么!搜索到处寻找答案,但无法找到它..理想情况下,我希望没有评级或评论的餐厅按照创建的第一个顺序显示在列表的底部

回答

2

默认情况下Rails加入会执行内部加入。所以它不包括没有评论的餐馆。

def index 
    if params[:search] 
    @restaurants = Restaurant 
     .search(params[:search]) 
     .order(:created_at => :desc) 
    else 
    @restaurants = Restaurant 
     .joins('LEFT JOIN reviews ON restaurants.id = reviews.restaurant_id') 
     .group('restaurants.id') 
     .order('AVG(reviews.rating) DESC NULLS LAST') 
    end 
end 
+0

我试过这个,不得不改变(:restaurants =>:id)到('restaurants.id'),它的工作,但唯一的问题是审查和评级的餐馆出现,但在底部未经审核和评级的餐馆名单出现在顶部。是否有办法让它们以最先创建的顺序出现在底部?我试着在最后加入restaurants.created_at DESC,但它毁掉了经过审查的餐厅的顺序。谢谢您的帮助。 – enkido 2015-04-01 09:54:18

+0

我更新了我的订购答案。如果你使用的是PostgreSQL,试试'NULLS LAST'部分。 – johnsorrentino 2015-04-01 14:04:13

+0

这工作!谢谢约翰。 – enkido 2015-04-01 14:27:55