2

私はクエリを作成していますが、クエリに使用するモデルに送信するパラメータを渡す必要があります。問題は、クエリがパラメータを受け入れることができないことです選択中に、これは私のクエリです:クエリを選択する際にパラメータを渡す

def self.reporte_inventario_total(params) 
    query = select("(SELECT Ruta FROM Rutas WHERE IdRutas = :rutaId or :rutaId = '') AS Ruta, 
     ISNULL((SELECT S.Stock/PP.PzaXCja AS INT FROM stockhistorico S LEFT JOIN ProductosXPzas PP ON S.Articulo=PP.Producto WHERE S.Articulo=Productos.Clave AND S.RutaId = :rutaId or :rutaId = '' AND fecha = :fechaDiaO or :fechaDiaO = ''),0) AS StockCajas, 
     ISNULL((SELECT S.Stock%PP.PzaXCja AS INT FROM stockhistorico S LEFT JOIN ProductosXPzas PP ON S.Articulo=PP.Producto WHERE S.Articulo=Productos.Clave AND S.RutaId = :rutaId or :rutaId = '' AND fecha = :fechaDiaO or :fechaDiaO = ''),0) AS StockPiezas, 
     Productos.Clave, Productos.Producto, Productos.CodBarras,Productos.Sector", ({rutaId: params[:search],fechaDiaO: params[:fechaDiaO]})) 

    end 

、これは私が

unsupported: Hash 
+0

あなたの文に '{'、 '}'があります。それが、あなたが 'ハッシュ'を持っていると思う原因です。もう1つのことは、 '?'(データを置き換えるために)を持っていないということです。 –

+0

@AlejandroMontilla、答えがありがとう、そうです、記号 "?"私はそれを括弧の中の変数に置き換えています。例えば、 ".where"の他のクエリでは、それは私のように動作します – luis31

+0

@ luis31、select( "sqlstatement ...."、rutaId:params [:search]、fechaDia0:params [:fechaDia0])作業。また、http://api.rubyonrails.org/classes/ActiveRecord/Sanitization/ClassMethods.html –

答えて

2

の誤差が出ているあなたの問題はwhere方法とは異なり、selectメソッドは、引数としてプレーンな文字列を期待していることで、 ?とは許可されませんプレースホルダ。

:rutaIdのような式を使用するには、sanitize_sql_arrayを呼び出して選択クエリをラップする必要があります。

reporte_inventario_totalは、いくつかのActiveRecord::Baseサブクラスのメソッドであると仮定すると:そのメソッドがプライベートであるとあるので、あなたは、ActiveRecord::Base.send(:sanitize_sql_array, ...)ようなものでsanitize_sql_array(...)を交換する必要がreporte_inventario_totalがいくつかActiveRecord::Baseサブクラスの外に書かれている場合

query_string = "SELECT Ruta FROM Rutas WHERE IdRutas = :rutaId or :rutaId ..." 
query = select(sanitize_sql_array([query_string, rutaId: params[:search], fechaDiaO: params[:fechaDiaO])) 

モデルのみで使用することを意図しています。

+1

を参照することもできます。私の疑問を解決してくれてありがとう、とてもうまく働いています。 – luis31

関連する問題