Rails 4,Postgresql - 自定义查询在控制器内部构造错误,在控制台中正确构建

时间:2013-12-18 16:52:39

标签: ruby-on-rails postgresql wildcard

我正在尝试编写一个查询,该查询将匹配至少以提交的字符开头的姓氏。无论我如何构造查询,无论我使用ILIKE,LIKE,〜*还是@@,从控制器调用方法时构造的查询都会将查询更改为simple =运算符。

完整的方法:

def self.search(params)
  if params.empty?
    return Evaluation.none
  end

  results = nil

  if params.include?(:appointment_start_date) && params.include?(:appointment_end_date)
    results = Evaluation.where(appointment_time: params.delete(:appointment_start_date)..params.delete(:appointment_end_date))
  end

  params.each do |key, value|
    case key
    when :l_name
      results = (results || Evaluation).where("to_tsquery('english', '#{value}:*') @@ to_tsvector('english', l_name)")
    when :ssn
      results = (results || Evaluation).joins(:candidate).where(candidates: { ssn: value })
    else
      results = (results || Evaluation).where("#{key} = ?", value)
    end
  end

  results.includes(:evaluation_type, :agency, :psychologist)
end

但相关的部分是:

.where("to_tsquery('english', '#{value}:*') @@ to_tsvector('english', l_name)")

如果我从Rails控制台调用该方法,则会生成预期的SQL查询并返回正确的记录。现在这是控制器动作:

def search
  authorize! :read, Evaluation
  @evaluations = Evaluation.search(evaluation_search_params).paginate(page: params[:page]).decorate
end

假设用户为搜索提交“kel”。出于某些原因,生成的查询是

SELECT "evaluations".* FROM "evaluations" WHERE (l_name = 'kel') ORDER BY "evaluations"."appointment_time" ASC LIMIT 30 OFFSET 0

(评估中有一个default_scope,因此是ORDER BY,所以这不是神秘的一部分。)

我已经尝试删除分页和Draper装饰无济于事,这两个也在控制台中正常工作。所以,我的问题是,为什么生成的查询与控制器调用时不同?我非常认真地对待我。

1 个答案:

答案 0 :(得分:0)

你是param键字符串而不是符号吗?这可能会影响案例陈述的哪个分支被选中。如果您不确定,请尝试调试并单步执行代码。

您可能只需要更改为字符串值:

params.each do |key, value|
  case key
  when "l_name"
    results = (results || Evaluation).where("to_tsquery('english', '#{value}:*') @@ to_tsvector('english', l_name)")
  when "ssn"
    results = (results || Evaluation).joins(:candidate).where(candidates: { ssn: value })
  else
    results = (results || Evaluation).where("#{key} = ?", value)
  end
end