Ruby on rails 按非';不要总是在场–;ActiveRecord | Rails 5
我在一个上市网站上工作,该网站与Ruby on rails 按非';不要总是在场–;ActiveRecord | Rails 5,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我在一个上市网站上工作,该网站与位置和查看模型一起工作。我能够根据位置的任何评论计算出的平均评分来排列位置列表 Location.all.sort\u by(&:rating) 抛出错误: An ArgumentError occurred in search#search: comparison of BigDecimal with nil failed 请注意,rating是一种模型方法,而不是数据库中的字段,因此使用了sort\u by 我应该如何进行最佳修改以使其正常运行? 任
位置和查看模型一起工作。我能够根据位置的任何评论计算出的平均评分来排列位置列表
Location.all.sort\u by(&:rating)
抛出错误:
An ArgumentError occurred in search#search:
comparison of BigDecimal with nil failed
请注意,rating
是一种模型方法,而不是数据库中的字段,因此使用了sort\u by
我应该如何进行最佳修改以使其正常运行?
任何帮助都将不胜感激
类位置
class Review
例如,如果没有可用的审阅,您可以返回0:
def rating
return 0 unless reviews.any?
reviews.average(:rating)
end
为了避免覆盖您的评级
方法(如果没有评论,您可能希望它返回nil
),您可以使用以下方法:
Location.all.sort_by { |l| l.rating || 0 }
这将允许没有评级的任何位置仅在未获得评级的情况下,在订单中退回到默认值0
然后,例如,您仍然可以区分真实审核分数为0
的地点和没有任何审核的地点
如果您担心0
的真实分数与未审核的分数冲突,您可以将默认分数设置得更低,即-1
例如,您可能需要在某个地方显示审核分数,如下所示:
= @location.rating || "Location has no reviews"
average
如果没有审核,则返回nil
。要解决这个问题,您可以排除没有评论的位置,单独对它们进行排序,或者提供默认评级。哎哟,从性能的角度来看,这会造成伤害,因为您必须一次加载每个位置的评论