sort_by一个并不总是存在的值 - ActiveRecord | Rails 5

时间:2018-06-11 09:51:03

标签: ruby-on-rails ruby activerecord

我正在开发一个适用于LocationReview模型的商家信息网站。我可以按照该位置存在的任何评论计算的平均评分来订购地点列表。

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

2 个答案:

答案 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