Railsクエリヘルパーメソッドを使用して、Railsアプリケーションで次のSQLステートメントを使用しようとしています。元の(Rails以外の)アプリケーションでのこのSQLの結果は、任意の文字を使用して誰かの名前をあいまい検索することです。たとえば、検索ボックスに「a」を入力すると、どこかに「a」の文字が含まれている全員の名前が返されます。「MarissaJones」と「AndreaBarfs」はどちらも一致します。
"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」を含めようとしませんでした)。ユーザー指定のパラメーターが1つあります: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人の従業員全員が返されます。これは、たとえば検索ボックスに「a」を入力したときにサーバーに表示されるSQLです。
Processing by EmployeesController#getEmployeesByName as JSON
Parameters: {"query"=>"a"}
Employee Load (0.1ms) SELECT id, firstname, lastname, title FROM "employees"
だから私の行動の最後の4行は無視されているようです
query.where("UPPER(CONCAT(firstName, ' ', lastName)) LIKE ?", q).to_sql
query.group("id")
query.order("lastname", "firstname")
respond_with query.all
誰かが私が間違っていることを説明できますか?前もって感謝します。