按平均评分和评论数从 table 中排序数据,包括没有评分或评论但使用活动记录的对象

Ordering data from table by average rating and number of reviews including objects with no rating or reviews yet using active record

我一直在尝试按平均评分和评论总数降序获取要在我的 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

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

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