【问题标题】:Pass parameter in the select of a query在查询的选择中传递参数
【发布时间】:2017-07-06 22:24:30
【问题描述】:

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

  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

【问题讨论】:

  • 您的声明中有{},这就是导致rails 认为您有Hash 的原因。另一件事是您没有?(用于替换数据)。
  • @AlejandroMontilla,感谢您的回答,没错,符号“?”我用括号内的变量替换它。例如,在“.where”中的其他查询中,它对我有用
  • @luis31, select("sqlstatement....", rutaId: params[:search], fechaDia0: params[:fechaDia0]) 我认为这会起作用。也可以参考api.rubyonrails.org/classes/ActiveRecord/Sanitization/…

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


【解决方案1】:

您的问题是 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, ...) 之类的东西,因为该方法是私有的并且仅用于模型。

【讨论】:

  • 我的朋友非常感谢您解决了我的疑问,效果很好,非常好。
猜你喜欢
  • 2016-03-29
  • 2016-04-05
  • 2019-07-11
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多