如何通过ActiveRecord select方法选择行名作为SQL命令?

时间:2013-08-29 14:44:29

标签: sql postgresql activerecord

我正在使用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")

但在我看来,这对我来说并不干净......

1 个答案:

答案 0 :(得分:1)

如果你将ActiveRecord交给一个字符串:

Motor.select('group')

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

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

Motor.select(:group)

获得合理的SQL。 AR会在某些情况下自动引用标识符,但不会在此处引用。

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

Motor.select('"group"')

双引号保护group不被解释为关键字,它们也保留了案例,因此您必须小心这一点。双引号是引用标识符的标准方式,但MySQL使用反引号,而其他数据库则使用其他内容。

真正的解决方案是避免将关键字用作列名或表名,将group列重命名为其他内容,以免出现此问题。