Rails + Postgres:如何使用多个可能为零的列来“排序”?

Rails + Postgres: How to `order` Using Multiple Possibly Nil Columns?

我在 Rails 应用程序中有一个 table,它存储两个属性,其中一个是时间戳(sent_at,如 Time.now),以及其他日期(sent_on,如 Time.now.to_date)。

我想按 sent_at|sent_on 的升序检索行(其中之一可能是 nil):

Order.first(20).order(sent_at: :asc, sent_on: :asc) # this doesn't work

你会怎么做?

谢谢!

我冒昧地使用 . You can use COALESCE 来按顺序评估它的参数。将返回第一个不是 NULL 的参数。

named_function = ::Arel::Nodes::NamedFunction
orders = Order.arel_table
Order.order(named_function.new('COALESCE', [orders[:sent_at], orders[:send_on]]).asc).first(20)

# results in:
#
# SELECT "orders".*
# FROM "orders"
# ORDER BY COALESCE("orders"."send_at", "orders"."send_on") ASC
# LIMIT 20

或者如果您不介意使用普通格式 SQL。

Order.order('COALESCE(sent_at, sent_on) ASC').first(20)

# results in:
#
# SELECT "orders".*
# FROM "orders"
# ORDER BY COALESCE(sent_at, sent_on) ASC
# LIMIT 20