为什么我无法按驼峰命名的列对记录进行排序

Why am I unable to sort records by a column with a camelCase name

我的卡片组 table 看起来像:

create_table "cardsets", force: :cascade do |t|
    t.string "name", null: false
    t.string "code", null: false
    t.integer "setOrder", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["code"], name: "index_cardsets_on_code", unique: true
end

当我运行命令时:

Cardset.all.order('setOrder ASC')

它响应:

Traceback (most recent call last):
ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR:  column 
"setorder" does not exist) LINE 1: SELECT  "cardsets".* FROM "cardsets" ORDER 
BY setOrder ASC L...

HINT:  Perhaps you meant to reference the column "cardsets.setOrder".
: SELECT  "cardsets".* FROM "cardsets" ORDER BY setOrder ASC LIMIT 

运行 再次查询,按任何其他字段排序正常工作。

我有一张卡片 table,它看起来与卡片集 table 完全一样,有一个 cardOrder 字段,当 运行 对该 table也是。

我能让它工作的唯一方法是用 "columnName" 引号封装列名,如下所示:

Cardset.all.where('"setOrder" ASC')

谁能解释一下这里的幕后情况。

我认为这里的问题归结为您的专栏名称,setOrder。如果是 lower-cased 而不是 camel-cased,问题就会消失。

当您创建 table 时,它将在 Postgres 中看起来像这样(不包括几列):

database=# \d cardsets
                                  Table "public.cardsets"
  Column  |       Type        | Collation | Nullable |               Default
----------+-------------------+-----------+----------+--------------------------------------
 id       | integer           |           | not null | nextval('cardsets_id_seq'::regclass)
 name     | character varying |           | not null |
 code     | character varying |           | not null |
 setOrder | integer           |           | not null |
Indexes:
    "cardsets_pkey" PRIMARY KEY, btree (id)

当 ActiveRecord 将您的 order 字符串参数转换为 SQL 查询时,没有您描述的双引号,列名 折叠 为小写.有关详细信息,请参阅 this answer or this answersetOrder 变为 setorder,table 上不存在,因此出现错误。

我认为您在这里有两个选择:将列名更改为 set_order 其中 is more conventional PostgreSQLsetorder,两者都可以在没有双引号的 ActiveRecord 中使用,或者继续在需要 ActiveRecord 查询该列的任何时候使用双引号。如果可能的话,我会推荐第一种方法。