2017-07-06 65 views
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

你的語句中有'{','}',這就是導致rails認爲你有'Hash'的原因。另一件事是你沒有'?'(用於替換數據)。 –

+0

@AlejandroMontilla,謝謝你的回答,沒錯,標誌「?」我用括號內的變量替換它。例如在「.where」中的其他查詢中,它適用於我這種方式 – luis31

+0

@ luis31,select(「sqlstatement ....」,rutaId:params [:search],fechaDia0:params [:fechaDia0])我認爲工作。你也可以參考http://api.rubyonrails.org/classes/ActiveRecord/Sanitization/ClassMethods.html –

回答

2

你的問題是select方法不像where方法需要一個簡單的字符串作爲它的參數錯誤,它不允許?:variable佔位符。

要使用像:rutaId這樣的表達式,您需要將選擇查詢打包爲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])) 

如果reporte_inventario_total是寫了一些ActiveRecord::Base子之外,那麼你需要的東西,如ActiveRecord::Base.send(:sanitize_sql_array, ...)更換sanitize_sql_array(...),因爲該方法是私有的,是打算僅在模型中使用。

+1

我的朋友非常感謝你解決我的疑問,它工作得很好,非常好。 – luis31