在查询的选择中传递参数

jef*_*eff 3 ruby sql ruby-on-rails ruby-on-rails-4 rails-activerecord

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

  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
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误

unsupported: Hash
Run Code Online (Sandbox Code Playgroud)

Dmi*_*nko 5

您的问题是与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]))
Run Code Online (Sandbox Code Playgroud)

如果reporte_inventario_total是在某个ActiveRecord::Base子类之外编写的,那么您需要替换sanitize_sql_array(...)为类似的内容ActiveRecord::Base.send(:sanitize_sql_array, ...),因为该方法是私有的并且仅用于模型中。

  • 我的朋友非常感谢您解决了我的疑问,它运行良好,非常好。 (2认同)