我在 Rails 应用程序中有一个表,它存储两个属性,其中一个是时间戳(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
你会怎样做?
谢谢!
最佳答案
我冒昧地使用了 comment of Islingre 。您可以使用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
关于ruby-on-rails - Rails + Postgres : How to `order` Using Multiple Possibly Nil Columns?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57914268/