我正在开发一个适用于Location
和Review
模型的商家信息网站。我可以按照该位置存在的任何评论计算的平均评分来订购地点列表。
Location.all.sort_by(&:rating)
抛出错误:
An ArgumentError occurred in search#search:
comparison of BigDecimal with nil failed
注意rating
是模型方法,而不是数据库中的字段,因此使用sort_by
。
我应该如何最好地修改才能实现这一目标?
任何帮助将不胜感激!
class Location < ApplicationRecord
has_many :reviews
def rating
self.reviews.average('rating')
end
end
class Review < ApplicationRecord
belongs_to :location
validates :title, presence: true
validates :email, presence: true
validates :rating, presence: true
validates :comment, length: { maximum: 500 }
validates :location, presence: true
end
答案 0 :(得分:1)
为避免必须覆盖您的rating
方法(如果没有评论,您可能希望它返回nil
),您可以使用以下内容:
Location.all.sort_by { |l| l.rating || 0 }
如果未获得评级,这将允许任何没有评分的位置在订单 中回退到默认值0
。
然后,例如,您仍然可以区分具有0
的真实评论分数和没有任何评论的评分。
如果您担心0
的真实分数与没有评论的分数发生冲突,您可以将默认设置设置为较低,即-1
。
例如,您可能希望在某处显示评论分数,如下所示:
= @location.rating || "Location has no reviews"
答案 1 :(得分:0)
例如,如果没有可用的评论,您可以返回0:
def rating
return 0 unless reviews.any?
reviews.average(:rating)
end