我试图在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
任何人都可以解释我做错了什么。先感谢您。
答案 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
上调用group
,order
和Employee
,但忽略每种情况下的结果。最后,您通过实例调用Employee.all
,并检查结果,该结果正确包含所有记录。
尝试类似:
respond_with Employee.where("UPPER(CONCAT(firstName, ' ', lastName)) LIKE ?", q).group("id").order("lastname", "firstname")