2016-05-11 45 views
1

我有一個奇怪的現象這是我的模型:哪裏。(:SKU => 'sku123')對,其中('SKU =

UpcCode 

=> UpcCode(id: integer, Upc: string, Sku: string, Active: boolean, created_at: datetime, updated_at: datetime)

正如你所看到的,SKU是我的一個列

當我在IRC鍵入:

UpcCode.where(:Sku => 'SKU123').first 

我得到預期的結果:

UpcCode Load (0.9ms) SELECT "upc_codes".* FROM "upc_codes" WHERE "upc_codes"."Sku" = $1 ORDER BY "upc_codes"."id" ASC LIMIT 1 [["Sku", "GC-115-42"]] => # <UpcCode id: 95, Upc: "70163098XXXX", Sku: "SKU123", Active: true, created_at: "2016-05-11 03:12:11", updated_at: "2016-05-11 03:12:11">

但是當我嘗試使用這個語法如下:

UpcCode.where("Sku = 'SKU123'").first 

UpcCode.where('Sku = "GC-115-42"').first 

我越來越彷彿SKU列不存在以下錯誤。

UpcCode Load (5.2ms) SELECT "upc_codes".* FROM "upc_codes" WHERE (Sku = "GC-115-42") ORDER BY "upc_codes"."id" ASC LIMIT 1 ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "sku" does not exist

我需要能夠使用第二種語法,因爲我需要操縱結果。即不區分大小寫的比較。

+2

所有的標識符那些沒有加雙引號的字符會在PG中轉換爲小寫字母,因爲你的列名'Sku'轉換爲'sku',所以它可以用作'UpcCode.where'(''Sku'=?', 'SKU123')' –

+0

@VishalJAIN工作。謝謝。 –

回答

4

不在雙引號的所有標識符轉換在PG爲小寫爲此您的列名Sku地轉化爲sku所以它給出了這樣的問題,你可以試試這個方法:

UpcCode.where('"Sku" = ?','SKU123') 
0

嘗試像這樣:

UpcCode.where("'upc_codes'.'Sku' = 'SKU123'").first 
+0

沒有工作:-( –

3

或者你可以像

the_sku = 'SKU123' 
UpcCode.where("Sku = ?", the_sku).first 

更新

the_sku = 'SKU123' 
UpcCode.where('"Sku" = ?', the_sku).first 

PG需要你用double-quotation標記包裝區分大小寫的列名稱。

使用?是的benifit,它portects你SQL Injection

http://guides.rubyonrails.org/security.html#sql-injection


我的建議

您應該遵循沒有區分大小寫column_names的約定。 在Rails我們遵循的是因爲以下幾個原因

  • 它使你的代碼更可預測的未來合作者
  • 您將獲得在社區維基答案,所以更快速,輕鬆地社區公約;你不必很好奇
  • convention over configuration是我們Rails社區所擁有的最強點。
  • ...
+1

希望我可以upvote這個答案兩次。一次爲sql注入警告和一次約定配置。 – BM5k