我遇到了一个奇怪的情况。这是我的型号:
UpcCode
=>UpcCode(id:integer,Upc:string,Sku:string,Active:boolean,created_at:datetime,updated_at:date time)
正如你所看到的,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限制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")按"upc_codes"订购。"id"ASC限制1ActiveRecord::StatementInvalid:PG::UndefinedColumn:ERROR:列"sku"不存在
我需要能够使用第二种语法,因为我需要处理结果。即不区分大小写的比较。
所有不在双引号中的标识符都会转换为PG中的小写,因此您的列名Sku
会转换为sku
,因此会出现此问题,您可以尝试以下方式:
UpcCode.where('"Sku" = ?','SKU123' )
或者,您也可以像一样
the_sku = 'SKU123'
UpcCode.where("Sku = ?", the_sku).first
更新:
the_sku = 'SKU123'
UpcCode.where('"Sku" = ?', the_sku).first
PG
需要使用double-quotation
标记来包装区分大小写的列名。
使用?
的好处是,它从SQL Injection
中预示着你
请参阅http://guides.rubyonrails.org/security.html#sql-注入
我的建议
您应该遵循不具有区分大小写的column_names
的惯例。在Rails
中,由于以下原因,我们遵循社区惯例
- 它使您的代码对未来的合作者更加可预测
- 你将更快、更容易地在社区wiki和SO中得到答案;你不必好奇太久
convention over configuration
是我们Rails
社区的最强点
这样尝试:
UpcCode.where("'upc_codes'.'Sku' = 'SKU123'").first