2013-08-29 39 views
0

我正在使用PostgreSQL,我不確定爲什麼沒有需要使用查詢選擇參數的引用。這裏是例子 - 我的「電機」表中有一個名爲「group」的字段。而現在,如果我嘗試如何通過ActiveRecord的select方法選擇一個名爲SQL命令的行?

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" 

雖然命名不同領域相同的命令不是以「按組」命令類似衝突的完美的作品。

是不是一定有一些包裝報價或什麼?或者可能是我錯過了配置的東西?

幫助感謝!

P.S.

我想通了,其實我可以選擇行正是爲了表,如:

Motor.select("motors.group") 

但它不是在我看來,好乾淨..

回答

1

如果你手上的ActiveRecord的字符串:

Motor.select('group') 

那麼它將按原樣使用該字符串。否則,您將無法使用AR不能理解的select調用中的內容,否則AR將不得不解析該字符串並嘗試弄清楚您的真正含義;這兩種方法都存在很大問題。

不幸的是,如果你的手select別的,它最終會使用簡單的to_s調用的參數轉換爲字符串,然後我們又回到了第一種情況,所以你不能說:

Motor.select(:group) 

以獲得合理的SQL。 AR會在某些情況下自動引用標識符,但不會在這裏。

的短期解決方案是手動引用違規標識:

Motor.select('"group"') 

雙引號保護group被解釋爲關鍵字,他們還保留的情況下,所以你必須要小心的是。雙引號是引用標識符的標準方式,但MySQL使用反引號和其他數據庫使用其他內容。

真正的解決方案是避免使用關鍵詞作爲列名或表名,將您的group列重命名爲其他內容,以免出現此問題。

+0

謝謝,Motor.select('「group」')像魅力一樣工作!但是,像Motor.select一樣(「motors.group」)似乎也不乾淨)。但是,將來你會知道。 – sandric