簡體   English   中英

Rails將postgres SELECT *更改為SELECT COUNT

[英]Rails changes postgres SELECT * to SELECT COUNT

我正在與RailsCast一起使用令牌輸入,並正在嘗試清理Postgres的查詢方法。 我發現這篇文章是使我的查詢與數據庫無關的。

我的方法:

  def self.tokens(query)
    t = Language.arel_table
    languages = Language.where(t[:name].matches("%#{query}%"))
    if languages.empty?
      [{id: "<<<#{query}>>>", name: "New: \"#{query}\""}]
    end
  end

返回

:001 > Language.tokens('Ru')
   (0.8ms)  SELECT COUNT(*) FROM "languages"  WHERE ("languages"."name" ILIKE '%Ru%')

但是,如果我使用return而不是language = ,則會得到正確的查詢:

  def self.tokens(query)
    t = .arel_table
    return Language.where(t[:name].matches("%#{query}%"))
  end

:001 > Language.tokens('Ru')
  Language Load (0.9ms)  SELECT "languages".* FROM "languages"  WHERE ("languages"."name" ILIKE '%Ru%')

這可能很明顯,但是我無法弄清楚為什么第一種方法選擇count而不是選擇“語言”表db中的所有行。 我真的很想將該查詢的結果存儲在一個變量中。

這是因為where被盡可能地延遲解決(直到絕對需要時才解決)。 在您的情況下,在以下情況下需要它:

  1. 明確返回
  2. 檢查為空?

它進行計數的原因是通過計數確定它是否為空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM