where(:sku => 'sku123') vs where ('sku =



我遇到了一个奇怪的情况。这是我的型号:

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

最新更新