如何在订购 Active Record 对象时使 NaN 值最低?

how to make NaN value as the lowest when ordering Active Record objects?

我想对我的 table 进行排序,但其中包含 NaN 值,

问题出在 ruby/rails NaN 被认为是最高的,我想将其设为最低?

我正在考虑从列表中删除 NaN 对非 NaN 列表进行排序并在其后添加 NaN

谁有更方便的方法?

我的数据库是 postgresql,列类型是 Decimal/BigDecimal,值是 Decimal/BigDecimal

架构是

create_table "download_speeds", force: :cascade do |t|
    t.bigint "location_id", null: false
    t.string "operator_name"
    t.decimal "avg"
    t.decimal "min"
    t.decimal "max"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["location_id"], name: "index_download_speeds_on_location_id"
  end

我想 sort/give 根据 avg 列降序排列到 downloads_speeds

最高 avg 最高(排名 1)

看起来 avg 的值应该总是正数。因此,在 sql 查询中用 0 代替 NaN 应该会给你想要的排序。您不必在 sql 中编写整个查询,只需要顺序子句:

  DownloadSpeed.where(created_at: Date.today).order("CASE WHEN avg='NaN' THEN 0 ELSE 1 END, avg")

显然这只是 postgresql 使用 NaN

排序的方式

解决方法是使用 SQL 语法将 NaN 更改为 null,然后设置选项以在订购时将 null 值设置为最后一个

 DownloadSpeed.order(Arel.sql("nullif(avg, 'NaN') desc nulls last"))

相关问题:

Why do NULL values come first when ordering DESC in a PostgreSQL query?