sort_by значение, которое не всегда присутствует - ActiveRecord |Рельсы 5 - PullRequest
0 голосов
/ 11 июня 2018

Я работаю на сайте листинга, который работает с моделями 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

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Чтобы избежать необходимости перезаписывать ваш метод rating (вы можете захотеть, чтобы он возвращал nil, если нет отзывов), вы можете использовать следующее:

Location.all.sort_by { |l| l.rating || 0 }

Это разрешит любое местоположениебез рейтинга для возврата к значению по умолчанию 0 в порядке только , если у него нет рейтинга.

Тогда, например, вы все еще можете различать местоположения с помощью подлинного обзора0 и те, у кого нет отзывов.

Если вас беспокоят подлинные оценки 0, противоречащие тем, у которых нет отзывов, вы можете установить значение по умолчанию ниже, то есть -1.

Например, у вас может быть где-то, что вы хотите отобразить оценки за обзор следующим образом:

= @location.rating || "Location has no reviews"
0 голосов
/ 11 июня 2018

Например, вы можете вернуть 0, если обзор недоступен:

  def rating
    return 0 unless reviews.any?
    reviews.average(:rating)
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...