我正在尝试编写一个查询,该查询将匹配至少以提交的字符开头的姓氏。无论我如何构造查询,无论我使用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装饰无济于事,这两个也在控制台中正常工作。所以,我的问题是,为什么生成的查询与控制器调用时不同?我非常认真地对待我。
答案 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