0

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 

誰かが私が間違っていることを説明できますか?前もって感謝します。

4

2 に答える 2

0

クエリに他のSQLを含めるようにしました

respond_with Employee.select("id, firstname, lastname, title").where("UPPER(CONCAT(firstName, ' ', lastName)) LIKE ?", params[:query])

sqlite3にはCONCAT関数がないことがわかりましたが、それは別の問題です。

于 2013-01-16T23:33:43.810 に答える
0

queryEmployee最初の行によってのインスタンスが割り当てられています。次に、インスタンスを介してクラスwheregroup、、を呼び出しますが、すべての場合で結果を無視します。最後に、インスタンスを介して呼び出し、すべてのレコードを正しく含む結果を検査します。次のようなものを試してください:orderEmployeeEmployee.all

respond_with Employee.where("UPPER(CONCAT(firstName, ' ', lastName)) LIKE ?", q).group("id").order("lastname", "firstname")
于 2013-01-16T23:34:09.067 に答える