将值数组发送到 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 查询? 的相关文章

  • 如何使用 typeorm 在 postgres 中保存 json 对象数组

    我正在尝试在 postgres 中保存 jsonb 类型的对象数组 Entity Column type jsonb array true nullable true testJson object 我在邮递员中发送的json testJs
  • 在 CircleCI 中设置 Elasticsearch 和 Ruby on Rails

    我正在尝试在 Rails 应用程序中使用 Elasticsearch 设置 CircleCI 我想已经配置了镜像 但是如何在 CI 中连接到它 到目前为止我已经尝试过 https github com elastic elasticsear
  • RSpec 请求规范发布一个空数组

    我目前正在 Rails 中开发 API 端点 如果我需要的数据无效 我想确保端点响应具有正确的错误状态 我需要一个 id 数组 无效值之一是空数组 Valid vendor district ids 2 4 5 6 Invalid vend
  • Rails Capistrano 3 - 如何将 production.log 文件共享到 Capistrano 的共享文件夹中?

    我正在使用 Capistrano 3 与我的 Rails 应用程序一起部署 问题是 每次我将应用程序部署到服务器时 log development log 文件都会重置 我听说可以将 production log 文件放入共享文件夹中并在每
  • 回形针不支持 .doc 文件

    在 Rails 4 0 2 中 我使用回形针 gem 上传文件 但它不支持 doc 文件 在文件上传字段下方 显示一条错误消息 扩展名与其内容不匹配 在模型中 检查内容类型的验证如下 validates attachment content
  • 在 Web 应用程序中显示最新的提交值?

    我有一些 Rails 应用程序 我使用 Git 作为版本控制系统 我使用 GitHub 或 Beanstalk 作为存储库主机 从理论上讲 我想要做的事情非常简单 以某种方式在 Web 应用程序的页脚中显示最新的提交 ID 号 哈希值 这样
  • Rails 3.1 和图像资源

    我已将管理主题的所有图像放入名为 admin 的文件夹内的资产文件夹中 然后我像平常一样链接到它 Ruby image tag admin file jpg CSS logo background url assets images adm
  • Rails 4 的 mobile_fu

    我正在尝试将我的应用程序从 Rails 3 2 13 切换到 Rails 4 在此过程中 我遇到了一个主要障碍 我使用 gem mobile fu 来确定用户是否来自移动设备 该 gem 需要 Railties 3 2 13 但 Rails
  • Rails 5:验证复选框的接受

    我有一个带有一些嵌套字段的注册表单 在该表单中我添加了一个服务条款的复选框 我正在尝试验证复选框何时被选中 如果没有 则返回错误 validates acceptance of agreement allow nil gt true acc
  • Capybara-webkit 无法处理与 bootstrap glyphicon 的链接

    我有一个链接 link to q span class glyphicon glyphicon trash span html safe feed item data confirm Are you sure toggle tooltip
  • 跨多个表进行搜索,并在结果行中显示表名称

    如何构建 SQL 语句以跨多个平面不相关的表运行 并使用选择结果和结果来自的表的名称显示结果 这种情况是这样的 我有几个表 每个表都有相同的列名 这是我从外部各方收到的数据 并将其存储在不同的表中 相同的表看起来像 Table 1 pid
  • 如何在两个模型之间建立两个 has_many/belongs_to 关系?

    我有一个Project模型 以及一个Contact模型 项目模型有一个所有者和一个客户 两者都是Contacts 显然我遇到了一些不明确的事情 因为如果我有联系人并询问其项目 Rails 将不知道我询问的是它的项目是客户还是所有者 到目前为
  • 如何 md5 所有列(无论类型如何)

    我想创建一个 sql 查询 或 plpgsql 它将 md5 所有给定的行 无论类型如何 但是 在下面 如果 1 为空 则哈希为空 UPDATE thetable SET hash md5 accountid accounttype cre
  • Rails - 安装 Spree 时出现问题

    我在 Rails 应用程序中安装 Spree 时遇到问题 当我运行 gem spree 时 按照说明http spreecommerce com documentation getting started html http spreeco
  • PESSIMISTIC_WRITE 是否锁定整个表?

    只是为了确保我正确理解事情是如何运作的 If I do em lock employee LockModeType PESSIMISTIC WRITE 它会仅阻止该实体吗 employee 或整个表Employees 如果重要的话 我正在谈
  • 检查 postgres 复制状态

    有人可以建议检查 postgresql 复制状态的步骤以及如何确定复制是否未正确进行吗 我们在 pgsql9 0 和 pgsql9 4 中使用流复制 我通常使用以下 SQL 查询来检查 Postgres v11 的状态 关于主人 selec
  • 在rails生成脚手架中跳过JSON格式

    当您使用类似命令生成 Rails 脚手架时rails g scaffold Thing有什么办法可以避免变得烦人吗 respond to do format format html index html erb format json re
  • 使用间隔阈值对不同的连续时间戳记录进行分组

    我有一系列间歇性间隔的带有时间戳的 GPS 坐标 我正在使用 PostGIS 将它们渲染到地图画布上 为了渲染它们 需要使用 PostGIS 中的 ST MakeLine 聚合函数将点聚合成线 从而在地图上留下 GPS 数据丢失的间隙 数据
  • 在 postgres 查询中使用列表

    我有一个动态列表 list a b c d 所以长度可能会改变 我想在查询中比较这些列表值 select from student where name in all the list values 我想将列表值传递到此查询中 我怎样才能做
  • 升级到 Rails 6 时是否有一种编程方法可以检测 Zeitwerk::NameError?

    我目前正在将旧的 Rails 应用程序迁移到 Rails 6 好像项目中有些文件和里面定义的类不一致 运行应用程序测试时我没有看到此错误 但部署后我收到如下错误 Zeitwerk NameError expected file app my

随机推荐

  • 使用 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