0

我正在使用 PostgreSQL,但我不太确定为什么没有引用需要通过查询选择的参数。这是示例 - 我的“电机”表中有一个名为“组”的字段。现在,如果我尝试

Motor.select("group")

输出将包含错误:

  Motor Load (0.5ms)  SELECT group FROM "motors"
  PG::SyntaxError: ERROR:  syntax error at or near "group"
  LINE 1: SELECT group FROM "motors"

虽然不同字段的相同命令与“group by”命令不冲突,但效果很好。

是不是必须有一些环绕引号之类的?或者我可能错过了配置中的一些东西?

帮助表示赞赏!

附言

我发现我实际上可以为表格精确选择行,如:

Motor.select("motors.group")

但在我看来它不是那么好和干净..

4

1 回答 1

1

如果你给 ActiveRecord 一个字符串:

Motor.select('group')

然后它将按原样使用该字符串。否则,您将无法在select调用中使用 AR 不理解的内容,或者 AR 必须解析字符串并尝试找出您的真正意思;这两种方法都存在很大问题。

不幸的是,如果您select提供其他任何东西,最终将使用简单to_s的调用将参数转换为字符串,然后我们回到第一种情况,所以您不能说:

Motor.select(:group)

获得明智的SQL。AR 在某些情况下会自动引用标识符,但在这里不会。

短期解决方案是手动引用有问题的标识符:

Motor.select('"group"')

双引号可防止group被解释为关键字,它们还保留大小写,因此您必须小心。双引号是引用标识符的标准方式,但 MySQL 使用反引号,而其他数据库使用其他东西。

真正的解决方案是避免使用关键字作为列名或表名,将您的group列重命名为其他名称,这样您就不会遇到这个问题。

于 2013-08-29T15:42:17.060 回答