Я немного опоздал с игрой, но это только что появилось снова, и решение на самом деле не так уж сложно.
Переносимое решение состоит в использовании CASE, чтобы превратить NULL в нечто, что пойдетк концу.Если ваш рейтинг не отрицательный, тогда -1 - хороший выбор:
order('case when average_rating is null then -1 else average_rating end desc')
Использование COALESCE вместо этого будет работать во многих базах данных и будет намного менее шумным, чем CASE:
order('coalesce(average_rating, -1) desc')
Если вы хотите сортировку ASC, то вышеупомянутые подходы поместят NULL в начале.Если бы вы хотели их в конце, вы бы использовали что-то большее, чем ваш самый высокий рейтинг вместо -1.Например, если вы оцениваете значения от одного до пяти, вы можете использовать 11 для замены NULL:
order('case when average_rating is null then 11 else average_rating end asc')
order('coalesce(average_rating, 11) asc')
Большинство людей будут использовать 10, но иногда вам нужно немного громче, чтобы наши переходили к 11.
Вы не можете полагаться на то, что база данных выставит значения NULL в начале или конце, поэтому лучше быть явным, даже если вы просто напоминаете своему будущему себе, что вы уже обработали случай NULL.