Ruby on rails 其中(:sku=>'sku123')与其中('sku=

Ruby on rails 其中(:sku=>'sku123')与其中('sku=,ruby-on-rails,ruby,postgresql,ruby-on-rails-4,activerecord,Ruby On Rails,Ruby,Postgresql,Ruby On Rails 4,Activerecord,我有一个奇怪的情况。这是我的模型: UpcCode =>UpcCodeid:integer,Upc:string,Sku:string,Active:boolean, 创建时间:datetime,更新时间:datetime 如您所见,Sku是我的专栏之一 当我输入IRC时: UpcCode.where(:Sku => 'SKU123').first 我得到了预期的结果: upc代码加载0.9ms从upc_代码中选择upc_代码。*,其中 upc_code.Sku=$1订单按upc_co

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

UpcCode
=>UpcCodeid:integer,Upc:string,Sku:string,Active:boolean, 创建时间:datetime,更新时间:datetime

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

当我输入IRC时:

UpcCode.where(:Sku => 'SKU123').first
我得到了预期的结果:

upc代码加载0.9ms从upc_代码中选择upc_代码。*,其中 upc_code.Sku=$1订单按upc_code.id ASC限额1 [[Sku,GC-115-42]=>

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

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

我得到以下错误,好像Sku列不存在一样

upc代码加载5.2ms从upc_代码中选择upc_代码。*,其中 Sku=GC-115-42按upc_代码订购。id ASC限制1 ActiveRecord::语句无效:PG::UnfinedColumn:错误:column sku不存在

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

尝试如下:

UpcCode.where("'upc_codes'.'Sku' = 'SKU123'").first
试着这样做:

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

或者你也可以这样做

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

PG需要将区分大小写的列名用双引号括起来

使用?的好处是,它可以防止SQL注入

我的建议

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

它使您的代码对未来的合作者更具可预测性 你将在社区维基上更快更容易地得到答案;你不必长时间地好奇 约定优于配置是我们Rails社区最强大的一点。 ...
或者你也可以这样做

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

PG需要将区分大小写的列名用双引号括起来

使用?的好处是,它可以防止SQL注入

我的建议

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

它使您的代码对未来的合作者更具可预测性 你将在社区维基上更快更容易地得到答案;你不必长时间地好奇 约定优于配置是我们Rails社区最强大的一点。 ...
所有不在双引号中的标识符都将转换为PG中的小写,因此您的列名Sku将转换为Sku,因此您可以尝试以下方法:

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

所有不在双引号中的标识符都将转换为PG中的小写,因此您的列名Sku将转换为Sku,因此您可以尝试以下方法:

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

所有不在双引号中的标识符都将转换为小写,您的列名Sku将转换为Sku,因此您可以将此问题用作UpcCode。其中“Sku=?”,“SKU123”@VishalJAIN起作用。谢谢。所有不在双引号中的标识符将转换为小写,您的列名Sku ge将在PG中t转换为sku,因此它给出了这个问题,您可以将其用作UpcCode。其中'sku=?','SKU123'@VishalJAIN有效。谢谢。希望我可以对这个答案进行两次UPVOT。一次用于sql注入警告,一次用于约定优于配置。希望我可以对这个答案进行两次UPVOT。一次用于sql注入警告,一次用于约定优于配置配置