sql查询与Active Record查询助手一起出错

时间:2013-01-16 22:57:57

标签: sql ruby-on-rails

我试图在Rails应用程序中使用以下sql语句和Rails查询辅助方法。原始(非Rails)应用程序中此sql的结果是使用任何字母对某人的名称进行模糊搜索。例如,如果您在搜索框中输入“a”,它将返回其中某处包含字母“a”的所有名称。 “Marissa Jones”和“Andrea Barfs”都是比赛。

      "select e.id, e.firstName, e.lastName, e.title " .
      "from employee e left join employee r on r.managerId = e.id " .
      "WHERE UPPER(CONCAT(e.firstName, ' ', e.lastName)) LIKE :name " .
      "group by e.id order by e.lastName, e.firstName";

我尝试使用一些Rails活动记录查询接口帮助方法来翻译该sql语句。 (我没有尝试从上面的sql中包含'join',因为它似乎不需要模糊搜索或我的应用程序的目的)。有一个用户提供的参数:query

employees_controller.rb

respond_to :json
 ...
def getEmployeesByName

    query = Employee.select("id, firstname, lastname, title")
    q = "%#{params[:query]}%"
    query.where("UPPER(CONCAT(firstName, ' ', lastName)) LIKE ?", q).to_sql
    query.group("id")
    query.order("lastname", "firstname")

    respond_with query.all 

end 

当我尝试我的代码时,即使他们的名字中没有字母“a”,它也会返回数据库中的所有5名员工。这是服务器中显示的sql,例如,当我在搜索框中输入“a”时。

  Processing by EmployeesController#getEmployeesByName as JSON
  Parameters: {"query"=>"a"}
  Employee Load (0.1ms)  SELECT id, firstname, lastname, title FROM "employees" 

所以我的行动的最后四行似乎被忽略了

    query.where("UPPER(CONCAT(firstName, ' ', lastName)) LIKE ?", q).to_sql
    query.group("id")
    query.order("lastname", "firstname")
    respond_with query.all 

任何人都可以解释我做错了什么。先感谢您。

2 个答案:

答案 0 :(得分:0)

我通过执行

将其包含在查询中
respond_with Employee.select("id, firstname, lastname, title").where("UPPER(CONCAT(firstName, ' ', lastName)) LIKE ?", params[:query])

事实证明,sqlite3没有CONCAT功能,但这是一个单独的问题。

答案 1 :(得分:0)

第一行为

query分配了Employee的实例。然后,您通过实例在类where上调用grouporderEmployee,但忽略每种情况下的结果。最后,您通过实例调用Employee.all,并检查结果,该结果正确包含所有记录。 尝试类似:

respond_with Employee.where("UPPER(CONCAT(firstName, ' ', lastName)) LIKE ?", q).group("id").order("lastname", "firstname")