我正在与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而不是“languages”表db中的所有行。我真的想把查询结果存储在一个变量中。

最佳答案

这是因为哪里被尽可能地懒洋洋地解决了(除非它是绝对需要的)。在你的情况下,当你:
显式返回
空头支票?
它进行计数的原因是通过计数来确定它是否为空。

10-08 13:14