我有个奇怪的情况。这是我的模型:
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)从"upc_codes“中选择"upc_codes".*,其中”upc_codes“。”Sku“= $1,由”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)从"upc_codes“中选择"upc_codes".* (Sku = "GC-115-42"),按”upc_codes“排序。
我需要能够使用第二种语法,因为我需要操作结果。即不区分大小写的比较。
发布于 2016-05-11 05:02:31
所有不在双引号中的标识符都在PG中转换为小写,因为您的列名Sku转换为sku,因此您可以尝试这样做:
UpcCode.where('"Sku" = ?','SKU123' )发布于 2016-05-11 04:47:27
或者你也可以像
the_sku = 'SKU123'
UpcCode.where("Sku = ?", the_sku).first更新
the_sku = 'SKU123'
UpcCode.where('"Sku" = ?', the_sku).firstPG需要用double-quotation标记包装区分大小写的列名。
使用?的好处是,它使您脱离了SQL Injection
请参阅http://guides.rubyonrails.org/security.html#sql-injection
我的建议
您应该遵循不区分大小写的column_names的惯例。在Rails中,我们遵循社区惯例,原因如下
convention over configuration是我们Rails社区最强大的一点。发布于 2016-05-11 04:36:50
就像这样:
UpcCode.where("'upc_codes'.'Sku' = 'SKU123'").firsthttps://stackoverflow.com/questions/37153176
复制相似问题