我正在使用PostgreSQL,我不太清楚为什么没有引用需要通过查询选择的参数。这是一个例子 - 我的“马达”表中有一个名为“group”的字段。现在,如果我试着
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”命令不冲突的不同字段的相同命令工作正常。
是不是必须有一些包装报价或什么?或者我可能在配置中错过了什么?
帮助表示赞赏!
P.S。
我发现我实际上可以精确地为表选择行,如:
Motor.select("motors.group")
但在我看来,这对我来说并不干净......
答案 0 :(得分:1)
如果你将ActiveRecord交给一个字符串:
Motor.select('group')
然后它会按原样使用该字符串。否则,您将无法使用AR不理解的select
调用中的内容,或者AR将不得不解析该字符串并尝试找出您的真实含义;这两种方法都存在很大问题。
不幸的是,如果你把select
交给其他任何东西,它最终会使用简单的to_s
调用将参数转换为字符串,然后我们又回到了第一种情况,所以你不能说:
Motor.select(:group)
获得合理的SQL。 AR会在某些情况下自动引用标识符,但不会在此处引用。
短期解决方案是手动引用有问题的标识符:
Motor.select('"group"')
双引号保护group
不被解释为关键字,它们也保留了案例,因此您必须小心这一点。双引号是引用标识符的标准方式,但MySQL使用反引号,而其他数据库则使用其他内容。
真正的解决方案是避免将关键字用作列名或表名,将group
列重命名为其他内容,以免出现此问题。