通过平均评级和评论数量从表中订购数据,包括没有评级的对象或使用活动记录的评论

时间:2015-04-01 00:37:20

标签: sql ruby-on-rails activerecord erb

我一直试图通过平均评分和按降序排列的评论总数来获取要在我的rails应用中订购和显示的餐馆列表。到目前为止,我能够正确地从数据库(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

我在这里明显遗漏了一些东西,但我不知道是什么!搜索到处都找到答案,但无法找到答案。理想情况下,我希望没有评级或评论的餐厅按照创建的顺序显示在列表底部

1 个答案:

答案 0 :(得分: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