首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >其中(:sku => 'sku123')与where ('sku =

其中(:sku => 'sku123')与where ('sku =
EN

Stack Overflow用户
提问于 2016-05-11 04:32:25
回答 3查看 262关注 0票数 1

我有个奇怪的情况。这是我的模型:

代码语言:javascript
复制
UpcCode

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

如你所见,Sku是我的专栏之一。

当我输入IRC时:

代码语言:javascript
复制
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">

但是,当我使用以下语法尝试时:

代码语言:javascript
复制
UpcCode.where("Sku = 'SKU123'").first

代码语言:javascript
复制
UpcCode.where('Sku = "GC-115-42"').first

如果Sku列不存在,我将得到以下错误。

UpcCode Load (5.2ms)从"upc_codes“中选择"upc_codes".* (Sku = "GC-115-42"),按”upc_codes“排序。

我需要能够使用第二种语法,因为我需要操作结果。即不区分大小写的比较。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-11 05:02:31

所有不在双引号中的标识符都在PG中转换为小写,因为您的列名Sku转换为sku,因此您可以尝试这样做:

代码语言:javascript
复制
UpcCode.where('"Sku" = ?','SKU123' )
票数 4
EN

Stack Overflow用户

发布于 2016-05-11 04:47:27

或者你也可以像

代码语言:javascript
复制
the_sku = 'SKU123'
UpcCode.where("Sku = ?", the_sku).first

更新

代码语言:javascript
复制
the_sku = 'SKU123'
UpcCode.where('"Sku" = ?', the_sku).first

PG需要用double-quotation标记包装区分大小写的列名。

使用?的好处是,它使您脱离了SQL Injection

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

我的建议

您应该遵循不区分大小写的column_names的惯例。在Rails中,我们遵循社区惯例,原因如下

  • 它使您的代码对未来的协作者更加可预测。
  • 你会在社区的wiki中得到答案,这样你就能更快更容易地得到答案;你不需要花很长时间去思考
  • convention over configuration是我们Rails社区最强大的一点。
  • ..。
票数 3
EN

Stack Overflow用户

发布于 2016-05-11 04:36:50

就像这样:

代码语言:javascript
复制
UpcCode.where("'upc_codes'.'Sku' = 'SKU123'").first
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37153176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档