为什么我无法按驼峰命名的列对记录进行排序
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 answer。 setOrder
变为 setorder
,table 上不存在,因此出现错误。
我认为您在这里有两个选择:将列名更改为 set_order
其中 is more conventional PostgreSQL 或 setorder
,两者都可以在没有双引号的 ActiveRecord 中使用,或者继续在需要 ActiveRecord 查询该列的任何时候使用双引号。如果可能的话,我会推荐第一种方法。
我的卡片组 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 answer。 setOrder
变为 setorder
,table 上不存在,因此出现错误。
我认为您在这里有两个选择:将列名更改为 set_order
其中 is more conventional PostgreSQL 或 setorder
,两者都可以在没有双引号的 ActiveRecord 中使用,或者继续在需要 ActiveRecord 查询该列的任何时候使用双引号。如果可能的话,我会推荐第一种方法。