Rails将postgres SELECT *更改为SELECT COUNT

时间:2014-07-27 00:16:08

标签: ruby-on-rails postgresql

我正在使用RailsCast进行令牌输入,并且正在尝试清理Postgres的查询方法。我发现this post使我的查询与数据库无关。

我的方法:

  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而不是'语言&#39;中的所有行。表db。我真的想将该查询的结果存储在变量中。

1 个答案:

答案 0 :(得分:1)

这是因为它尽可能懒得解决(直到它绝对需要)。在你的情况下,你需要它:

  1. 明确返回
  2. 检查空?
  3. 它进行计数的原因是通过计数确定它是否为空。