Sql 按平均评分和审核次数从表中排序数据,包括未评分的对象或尚未使用活动记录的审核
我一直在尝试在rails应用程序中按平均评分和评论总数降序排列要订购和显示的餐厅列表。到目前为止,我能够从数据库(psql)中正确地收集和订购它们,但问题是没有任何评论或评级的餐厅不会出现在列表中(这意味着它们不会显示在前端)。这些是我的模型:Sql 按平均评分和审核次数从表中排序数据,包括未评分的对象或尚未使用活动记录的审核,sql,ruby-on-rails,activerecord,erb,Sql,Ruby On Rails,Activerecord,Erb,我一直在尝试在rails应用程序中按平均评分和评论总数降序排列要订购和显示的餐厅列表。到目前为止,我能够从数据库(psql)中正确地收集和订购它们,但问题是没有任何评论或评级的餐厅不会出现在列表中(这意味着它们不会显示在前端)。这些是我的模型: class Restaurant < ActiveRecord::Base belongs_to :user has_many :reviews, dependent: :destroy validates :name, length:
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
很明显,我遗漏了一些东西,但我不知道是什么!到处寻找答案,但都找不到。。理想情况下,我希望没有评级或评论的餐厅按照先创建的顺序出现在列表的底部。默认情况下,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
我尝试了这个方法,不得不将(:restaurants=>:id)改为('restaurants.id'),效果不错,但唯一的问题是,经过审核和评级的餐厅按顺序出现,但在列表的底部,而未经审核和评级的餐厅出现在顶部。有没有办法让它们按照最初创建的顺序出现在底部?我尝试在最后添加restaurants.created_在DESC,但它破坏了已审核餐厅的顺序。谢谢你的帮助。我更新了订购的答案。如果您使用的是PostgreSQL,请尝试
null LAST
部分。
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