2017-07-06 70 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