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