ActiveRecord查询以第一次排序的空值查询

时间:2017-03-27 05:11:28

标签: ruby-on-rails postgresql activerecord

我有一个模型,topic,包括:

has_many :messages, -> { order('source_answer_id asc nulls first').order(id: :asc) }

在其他地方,当试图调用这种关系时,它会破坏某些参数。例如,以下结果会导致错误。

topic.messages.last.id

结果

ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR:  syntax error at or near "DESC"
LINE 1: ..." = $1  ORDER BY source_answer_id asc nulls first DESC, "mes...
                                                             ^
: SELECT  "message".* FROM "message" WHERE "message"."topic_id" = $1  ORDER BY source_answer_id asc nulls first DESC, "message"."id" DESC LIMIT 1

我认为这是因为nulls first会混淆asc

如何让ActivieRecord与nulls first玩得很好?

1 个答案:

答案 0 :(得分:0)

DESC和ASC表示空值无效。它们在非空值之前或之后出现:

  

NULLS FIRST和NULLS LAST选项可用于确定在排序顺序中非空值之前或之后是否出现空值。默认情况下,null值排序为大于任何非null值;也就是说,NULLS FIRST是DESC订单的默认值,否则为NULLS LAST。

这个order by第一个排序的source_answer_id以空值递增,第一个以null结尾降序的message.id排在最后

ORDER BY source_answer_id ASC NULLS FIRST,"message"."id" DESC NULLS LAST limit 1