在选择查询时传递参数

时间:2017-07-06 22:24:31

标签: sql ruby-on-rails ruby ruby-on-rails-4 rails-activerecord

我正在构建一个查询,但我需要将我发送的参数传递给要在查询中使用的模型,问题是我无法使查询接受select中的参数,这是我的查询:

  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

1 个答案:

答案 0 :(得分: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子类之外写的,那么您需要将sanitize_sql_array(...)替换为ActiveRecord::Base.send(:sanitize_sql_array, ...)之类的内容,因为该方法是私有的,并且是仅用于模型。