【问题标题】:where(:sku => 'sku123') vs where ('sku =where(:sku => 'sku123') 与 where ('sku =
【发布时间】:2016-05-11 04:32:25
【问题描述】:

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

UpcCode

=> UpcCode(id: integer, Upc: string, Sku: string, Active: boolean, created_at:日期时间,updated_at:日期时间)

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

当我输入 IRC 时:

UpcCode.where(:Sku => 'SKU123').first

我得到了预期的结果:

UpcCode 加载 (0.9ms) SELECT "upc_codes".* FROM "upc_codes" WHERE "upc_codes"."Sku" = $1 ORDER BY "upc_codes"."id" ASC LIMIT 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 加载 (5.2ms) SELECT "upc_codes".* FROM "upc_codes" WHERE (Sku = “GC-115-42”)按“upc_codes”排序。“id”ASC 限制 1 ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column “sku”不存在

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

【问题讨论】:

  • 所有不在双引号中的标识符都在 PG 中转换为小写,因为您的列名 Sku 被转换为 sku 所以它给出了这个问题,您可以将其用作 UpcCode.where('"Sku" = ?','SKU123' )
  • @VishalJAIN 成功了。谢谢。

标签: ruby-on-rails ruby postgresql ruby-on-rails-4 activerecord


【解决方案1】:

所有不在双引号中的标识符都在 PG 中转换为小写,因此您的列名 Sku 被转换为 sku 所以它给出了这个问题,您可以尝试这种方式:

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

【讨论】:

    【解决方案2】:

    你也可以这样做

    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-injection


    我的建议

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

    • 它使您的代码更容易被未来的合作者预测
    • 您将在社区 wiki 和 SO 中更快、更轻松地获得答案;你不必想很久
    • convention over configuration 是我们Rails 社区拥有的最强点。
    • ...

    【讨论】:

    • 希望我能对这个答案投两次赞成票。一次用于 sql 注入警告,一次用于约定优于配置。
    【解决方案3】:

    试试这样:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 2021-04-23
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多