将值数组发送到 ruby​​ 中的 sql 查询?

2023-11-21

我正在努力解决似乎是红宝石语义问题。我正在写一个方法,需要一个参数数量可变从一个表单并创建一个Postgresql 查询。

def self.search(params)
    counter = 0
    query = ""
    params.each do |key,value|
        if key =~ /^field[0-9]+$/
            query << "name LIKE ? OR "
            counter += 1
        end
    end
    query = query[0..-4] #remove extra OR and spacing from last

    params_list = []
    (1..counter).each do |i|
      field = ""
      field << '"%#{params[:field'
      field << i.to_s
      field << ']}%", '
      params_list << field
    end
    last_item = params_list[-1]
    last_item = last_item[0..-3] #remove trailing comma and spacing
    params_list[-1] = last_item

    if params
        joins(:ingredients).where(query, params_list)
    else
        all
    end
end

即使 params_list 是一个在数量上与“name LIKE ?”匹配的值数组。查询部分时,我收到错误:name LIKE 中的绑定变量数量错误(1 为 2)?或者名字像?我尝试使用 params_list 作为字符串,但效果也没有更好。 我对红宝石很陌生。

我使用以下代码处理 2 个参数,但希望允许用户最多提交 5 个参数(:field1、:field2、:field3 ...)

def self.search(params)
    if params
        joins(:ingredients).where(['name LIKE ? OR name LIKE ?', 
            "%#{params[:field1]}%", "%#{params[:field2]}%"]).group(:id)
    else
        all
    end
end

有人可以阐明我应该如何编程吗?


PostgreSQL 支持标准 SQL 数组和标准any op (...) syntax:

9.23.3。任何/一些(数组)

expression operator ANY (array expression)
expression operator SOME (array expression)

右侧是一个带括号的表达式,它必须生成一个数组值。使用给定的值计算左侧表达式并与数组的每个元素进行比较operator,它必须产生布尔结果。的结果ANY如果获得任何真实结果,则为“true”。如果未找到 true 结果(包括数组有零个元素的情况),则结果为“false”。

这意味着您可以像这样构建 SQL:

where name ilike any (array['%Richard%', '%Feynman%'])

这很好,也很简洁,那么我们如何让 Rails 来构建这个呢?这实际上很简单:

Model.where('name ilike any (array[?])', names.map { |s| "%#{s}%" })

无需手动引用,ActiveRecord 在填充数组时会将数组转换为正确引用/转义的列表?中的占位符。

现在你只需要构建names大批。像这样简单的事情应该做:

fields = params.keys.select { |k| k.to_s =~ /\Afield\d+\z/ }
names  = params.values_at(*fields).select(&:present)

您也可以转换单个'a b'输入到'a', 'b'通过扔一个split and flatten混合:

names = params.values_at(*fields)
              .select(&:present)
              .map(&:split)
              .flatten
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将值数组发送到 ruby​​ 中的 sql 查询? 的相关文章

随机推荐

  • 使用 Seaborn 绘制具有最小/最大着色的时间序列图

    I am trying to create a 3 line time series plot based on the following data in a Week x Overload graph where each Cluste
  • Mysql 从单列中选择计数值

    A 有一个名为 key 的列 1 1 2 2 2 2 3 现在我用 3 个查询来完成 SELECT count key as k FROM test WHERE key 1 SELECT count key as k FROM test W
  • 在 Lua 列表中搜索项目

    如果我有一个这样的项目列表 local items apple orange pear banana 如何检查 orange 是否在此列表中 在Python中我可以这样做 if orange in items do something Lu
  • 允许在“属性”窗口中使用多行字符串属性

    我有一个带有字符串属性的 Windows 窗体用户控件 用于设置文本框的文本 这个字符串can是多线的 我注意到 在某些具有文本属性的控件上 您不会被迫在单行属性文本框中键入内容 而是会弹出一个小窗口 您可以在其中键入多行内容 事实上 Wi
  • 是否可以在mysql视图中创建自增id列?

    我在 MySql 中创建了一个视图 但现在我的要求是在该视图中创建一个应该自动递增的 Id 列 我目前的观点是 CREATE VIEW pending assign report view AS select cg group name c
  • 使用 javascript 检查日期范围内是否存在周末

    想知道是否有人有解决方案来检查两个日期及其范围之间是否存在周末 var date1 Apr 10 2014 var date2 Apr 14 2014 funck isWeekend date1 date2 do function retu
  • 在 C++ 中使用带 ref-qualifier 的子成员函数重载不带 ref-qualifier 的父成员函数

    在 C 中 不能在一个类中用没有 ref qualifier 的成员函数重载带有 ref qualifier 的成员函数 但同时可以从父类继承一个成员函数并在子类中重载它 如示例所示 struct A void f void f overl
  • delphi中如何对日期时间进行编码

    我知道如何在Delphi中使用encodeate将单个YY MM和DD编码到日期时间字段中 或使用encodetime将单个HH SS MM和MS编码到日期时间字段中 但是有没有办法将日期和时间指定到日期时间中场地 因为使用encodeda
  • 在 IIS 上运行时,ASP.NET Web 应用程序中的模拟不起作用

    我正在开发在 Intranet 环境中工作的 ASP NET 4 0 MVC3 Web 应用程序 该应用程序使用 Windows 身份验证 其应用程序池由在域控制器上设置了 spn 的域用户运行 使用 Kerberos 进行身份验证 在 I
  • 如何在Java中拆分HashMap

    我想知道是否可以将 HashMap 拆分为更小的子映射 就我而言 我有一个包含 100 个元素的 HashMap 我想从原始 HashMap 创建 2 个 或更多 更小的 HashMap 第一个包含从 0 到 49 的条目 第二个包含从 5
  • SVN分支的一个分支

    我们的代码存储库包括 树干 分支 A 从主干开始 分支 B 从分支 A 开始 在分支 A 上工作的程序员希望将其重新集成到主干中 并继续仅在主干上工作 我们还不想将分支 B 重新集成到分支 A 中 是否可以让分支 B 与主干相关 而不是与分
  • 如何在不损坏文本的情况下去除点/噪音?

    我正在使用 OpenCV 和 Python 处理图像 我需要从图像中去除点 噪声 我尝试了扩张 使点变小 但是文本被损坏了 我还尝试了两次循环膨胀和一次腐蚀 但这并没有给出令人满意的结果 我还有其他方法可以实现这一目标吗 谢谢 EDIT 我
  • 当用户在输入字段中键入字符时突出显示 DIV 的文本

    我看过很多关于使用 javascript 在 DIV 中突出显示文本的帖子 但没有一个完全符合我的要求 我需要做的是在用户输入搜索词时逐个字符地突出显示特定 DIV 中的文本 相反 当用户退格或删除字符时 我需要 取消突出显示 同一 DIV
  • django.db.utils.IntegrityError:外键约束失败

    My 模型 py class Order models Model user models ForeignKey User blank True null True on delete models PROTECT customer ema
  • 如何从 Java 中的 SOAP 响应中提取数据?

    我设置了一个客户端来向国家气象局 SOAP 服务器发送请求 我收到了预期的响应 但我不确定从中提取所需数据的最佳方法 例如 XML 中有很多额外的数据 在 SOAPBody 中 但我只想获取我为 POJO 设置的参数 例如温度 的数据 提取
  • 从 JavaScript Online 访问客户端的“localhost”

    这就是我正在努力做的事情 我制作了一些包含 JavaScript 代码的 html 页面 并将它们托管在雅虎服务器上 现在 当具有特定浏览器的客户端查看这些网页时 JavaScript 代码使用XMLHTTPRequest在 h1ttp l
  • 向 Spring Boot 应用程序添加附加参数

    我想知道是否可以添加 spring 的附加参数 例如 Dspring profiles active prod到 Spring Boot 应用程序 以防将其作为service 我检查了自动生成的脚本spring boot maven plu
  • 如何在 Team Foundation Server 2015 中启用 C# 7 构建?

    我们在本地安装了 Team Foundation Server TFS 2015 我们希望使用 Visual Studio 2017 来利用最新的 C 语言功能 我们尚未准备好升级到 TFS 2017 需要执行哪些步骤才能在 TFS 201
  • 无法使用不同的用户名从 pg_dump 恢复 psql 数据库

    我需要使用 postgres 用户名 1 从计算机 1 转储一个 postgres 数据库 然后使用 postgres 用户名 2 将其恢复到计算机 2 上 我不断遇到错误 看起来备份文件想要使用 username1 当我在computer
  • 将值数组发送到 ruby​​ 中的 sql 查询?

    我正在努力解决似乎是红宝石语义问题 我正在写一个方法 需要一个参数数量可变从一个表单并创建一个Postgresql 查询 def self search params counter 0 query params each do key v