Ransack:如何使用不同的别名多次连接表?

2024-02-02

假设我有 :items 与 has_many 与 :properties 关联,那么我可以像这样搜索具有名称为 'a_name' 和值 'a_value' 的属性的所有项目

q: { properties_name_eq: 'a_name', properties_value_eq: 'a_value' }

现在,如果我想搜索具有名称为“a_name”和值“a_value”的属性以及名称为“another name”和值“another value”的属性的所有项目,该怎么办?

以下不起作用,因为它仅加入属性表一次

q: {
  g: {
    '0' => { properties_name_eq: 'a_name', properties_value_eq: 'a_value' },
    '1' => { properties_name_eq: 'another_name', properties_value_eq: 'another_value'}
  }
}

生成的 SQL 看起来像这样

  SELECT DISTINCT "items".* FROM "items"
  LEFT OUTER JOIN "properties" ON "properties"."item_id" = "items"."id"
  INNER JOIN ((SELECT "items".* FROM "items")) AS sel_111 on sel_111.id
  WHERE
  (("properties"."name" = 'a_name' AND "properties"."value" = 'a_value') AND ("properties"."name" = 'another_name' AND "properties"."value" = 'another_value'))

EDIT:

为了更清楚地说明我想要什么,我将在下面粘贴一个规范。

Item.create name: 'ab', properties_attributes: [{ name: 'a', value: 'a1'}, {name: 'b', value: 'b1'}]
Item.create name: 'a', properties_attributes: [{ name: 'a', value: 'a1'}]
Item.create name: 'b', properties_attributes: [{name: 'b', value: 'b1'}]
Item.create name: 'ax', properties_attributes: [{ name: 'a', value: 'a1'}, {name: 'b', value: 'x'}]
Item.create name: 'bx', properties_attributes: [{ name: 'a', value: 'x'}, {name: 'b', value: 'b1'}]
Item.create name: 'other', properties_attributes: [{ name: 'other', value: '123'}]

get :index, q: { properties_name_eq: 'a', properties_value_eq: 'a1' }
names = JSON.parse(response.body).map{|u| u['name']}
expect(names).to match_array ['ab', 'a', 'ax'] # OK!

get :index, 
  q: {
    m: 'or',
    g: {
      '0' => { properties_name_eq: 'a', properties_value_eq: 'a1' },
      '1' => { properties_name_eq: 'b', properties_value_eq: 'b1'}
    }
  }
names = JSON.parse(response.body).map{|u| u['name']}
expect(names).to match_array ['ab'] #FAILS!

只需使用Model.search(params[:q].try(:merge, m: 'or')),用你的例子:

q: {
  m: 'or',
  g: {
    '0' => { properties_name_eq: 'a_name', properties_value_eq: 'a_value' },
    '1' => { properties_name_eq: 'another_name', properties_value_eq: 'another_value'}
  }
}

您可以找到更多信息here https://github.com/activerecord-hackery/ransack#grouping-queries-by-or-instead-of-and

你需要一个or在查询的where级别,因为properties.name不能同时等于'a_name'和'another_name'。不需要表的第二个别名。

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

Ransack:如何使用不同的别名多次连接表? 的相关文章

  • Heroku:无法通过 Bundler 安装 gem

    我尝试使用以下命令将我的 Rails 应用程序推送到 Herokugit push heroku master f命令 我得到这个 Total 0 delta 0 reused 0 delta 0 remote Compressing so
  • 如何设置管理员批准模型的编辑

    我需要一个普通用户可以编辑模型的系统 但编辑实际上只有在管理员批准后才会发生 我发现了一颗宝石 叫做纸迹 https github com airblade paper trail它确实有模型版本控制 但不具体支持我想要做的事情 我想知道其
  • 无法验证 CSRF 令牌的真实性 Rails/React

    我的 Rails 应用程序中有一个 React 组件 我正在尝试使用它fetch 发送一个POST对于我在本地主机上托管的 Rails 应用程序 这给了我错误 ActionController InvalidAuthenticityToke
  • Rails:页面加载时间很长

    我有一个 Rails 项目 我在一个控制器中遇到了非常奇怪的事情 浏览器需要大约 3 分钟来加载页面 但 Rails 在日志中写入 Completed 200 OK in 20563ms Views 17144 2ms ActiveReco
  • 使用 SASS 切换用户主题 - Ruby on Rails

    所以我有一个 Rails 管理系统 允许用户选择一个主题 基本上是一组 SASS 颜色变量 它将使用新颜色重新编译 application css scss 当用户从下拉菜单中选择并提交时 更改此设置的最佳方法是什么 我阅读了一些有关缓存和
  • 当 config.cache_classes = true 时缺少方法

    我有两个名为 Scope 和 ScopeItem 的 ActiveRecord 模型 具有 has many 关系 class Scope lt ActiveRecord Base has many scope items end clas
  • 如何使用 rspec 测试 ActionCable 和 Devise?

    在我的 Rails 5 1 应用程序中 我使用设备进行身份验证和 ActionCable 我的 ActionCable 连接如下所示 module ApplicationCable class Connection lt ActionCab
  • Rails 3 默认作用域、可覆盖的作用域

    我遇到的情况是现有应用程序的行为正在发生变化 这让我非常头疼 我的应用程序有照片 照片有一个状态 batch queue or complete 应用程序中的所有现有照片都是 完整的 99 的情况下 我只需要显示完整的照片 并且在所有现有代
  • Postgres 使用 Rails Active Record 在 IN 列表中 ORDER BY 值

    我收到按 收入 排序的 UserId 列表 一次大约 1000 个 我在 我的系统数据库 中有用户记录 但 收入 列不存在 我想从 我的系统数据库 中检索用户 按照列表中收到的排序顺序 我尝试使用 Active Record 执行以下操作
  • 如何覆盖 Ruby Ranges 的 .. 和 ... 运算符以接受 Float::INFINITY?

    我想覆盖 and Ruby 中的运算符Range 原因是 我正在处理数据库中的无限日期范围 如果你拉一个infinty从 Postgres 中取出日期时间 你会得到一个Float INFINITY在红宝石中 问题是 我无法使用Float I
  • 如何阻止与 RSpec 和 Capybara 的外部连接?

    在我的 Rails 项目中 我想编写非理想条件的测试 例如缺乏互联网连接或超时 例如 我正在使用 gem 来联系 API 并且希望确保在我的应用程序和外部 API 之间存在连接问题时能够正确处理错误 我已经可以通过用录像机制作固定装置并从
  • 如何以 Rails 方式处理 JavaScript 事件(例如“link_to :remote”)?

    我正在使用 Ruby on Rails 4 我想以 Rails 方式处理 JavaScript 事件 也就是说 例如 假设我有以下内容 link to destroy article path article method gt delet
  • Mongoid 中的 find_or_create_by 线程安全吗?

    我有一个使用 Mongoid 的 find or create by 方法的网络应用程序 poll Poll find or create by fields 在投入生产之前 我尝试运行故障场景 我发现多个用户可以尝试使用此方法访问此资源
  • Rails 中的 PDF 导出

    我需要将包含一些图表的 HTML 页面导出为 PDF 有哪些好的 gem 可以做到这一点 PDFKit http railscasts com episodes 220 pdfkit http railscasts com episodes
  • 如何在 Rails 3.2.1 版本中注释 Rails 模型

    我正在尝试遵循一些在线教程来在 Rails 中注释我的模型 然而 似乎所有教程都在谈论过时的注释版本或不正确的安装 这真是一团糟 到目前为止我已经尝试过以下方法 1 在 Gemfile 中添加此内容 gem annotate 2 4 0 2
  • Rails 注释分段错误

    有一些问题围绕着这个问题 但没有什么真正能满足我的需求 After I bundle install下面列出了我的 Gemfile 我运行annotate并出现以下错误 Users nickcoelius rvm gems ruby 1 8
  • 为什么 mongrel 没有在 Rails 3.2.rc 中启动?

    启动 mongrel 的 GEMFILE gem rails 3 1 0 gem mongrel gt 1 2 0 pre2 启动 WEBrick 的 GEMFILE 不是杂种 gem rails 3 2 0 rc2 gem mongrel
  • Rails:CSRF 令牌不工作但已设置

    我在 Heroku 上有我的 Rails 3 应用程序 当我发送银行信息时 我得到 WARNING Can t verify CSRF token authenticity但我的 CSRF 令牌已设置 https gist github c
  • 使用 Ajax 在输入时提交 Textarea,然后渲染部分内容而不刷新整个页面

    目前我正在尝试通过 JS 和 Ajax 在没有提交按钮的情况下发表评论 并且它有效 问题是当帖子提交时 页面重新加载到 post id comment页面 我希望它呈现部分内容 而不是刷新整个页面或将我带到不同的页面 我对 JS 不熟悉 任
  • 为什么“捆绑”会在我的开发机器上安装生产 gem?

    Gemfile 说 gem sqlite3 groups gt development test gem mysql2 group gt production 然而当我打字时bundle install在我的开发机器上安装了所有 gem 我

随机推荐

  • 是否可以在 Visual Studio 中加载不匹配的符号?

    我有一个 Windows 小型转储 C 代码 和一个相应的 exe 文件 不幸的是 我没有完全匹配的 pdb 文件 但我确实有 pdb 其中包含在不同时间构建的完全相同的代码 在 Windbg 中 我可以使用 symopt 0x40 告诉它
  • 将双数四舍五入到十分位[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的 float 函数 https stackoverflow com questions 485525 round for float in c 好吧 假设我有电话号码8 47434 我想将其四
  • ts1206 装饰器在这里无效,Angular 2

    我开始编写 Angular 2 程序 但遇到了一个错误 ts1206 装饰器在这里无效 Component ts1206 decorators are not valid here selector my app moduleId modu
  • pandas 在重复 DataFrame.reset_index() 时崩溃

    这里有一个非常奇怪的错误 我正在使用 pandas 来合并多个数据帧 作为合并的一部分 我必须多次调用reset index 但是当我这样做时 它会在第二次或第三次使用 reset index 时意外崩溃 这是重现错误的最少代码 impor
  • 使用 google Sheets api 无需客户端登录

    我有一个从 Google 电子表格中获取数据的网站 我希望我的用户无需登录即可查看获取的数据 这可能吗 如何实现 为了获取和更新工作表数据 我只需要一个帐户 最好在服务器端登录 但是 我还没有看到任何不需要客户端登录的服务器端日志记录 以此
  • CORS - Facebook - 护照

    我正在尝试在我的 Nodejs Angular Express Passport 应用程序中通过 Facebook 实现 OAUTH 登录 但我对此很挣扎 我仍然收到 CORS 错误 XMLHttpRequest 已被 CORS 策略阻止
  • 使用 Spark 和 Java 进行分层采样

    我想确保我正在对数据的分层样本进行训练 Spark 2 1 及更早版本似乎支持这一点JavaPairRDD sampleByKey and JavaPairRDD sampleByKeyExact 正如所解释的here https spar
  • NextJS api 路由中的文件路径无法解析

    我正在尝试解析文件路径NextJS https nextjs org 我明白那个API路线 https nextjs org docs api routes introduction部署到 Vercel 时 工作方式略有不同 为了创建文件的
  • 使用子查询的 Sqlite 更新查询

    我必须更新表 test test 列 testconsent id 与表的 id 值test groupedconsent 哪里的patient id in test test and patient id in test groupedc
  • 使用 __setattr__ 和 __getattr__ 与 __slots__ 进行委托,而不会触发无限递归

    class A slots a def init self gt None self a 1 class B1 slots b def init self b gt None self b b def getattr self k retu
  • 如何在 MySQL 中获取当前日期和时间?

    是否有像 DATETIME 这样的值或命令可以在手动查询中使用来插入当前日期和时间 INSERT INTO servers server name online status exchange disk space network shar
  • WPF ListView/GridView 绑定

    我正在尝试制作一个简单的 VS 2017 扩展 它获取一个对象并显示它 我有数据返回并在文本框中显示 json 所以我知道数据正确返回 但由于某种原因 gv 仅显示单词 id 两次 因为它们是数据集中的两条记录 我已经尝试了很多事情 但我却
  • 动态加载字体 html jquery

    我正在开发一个允许用户输入一些文本并将其拖动到适当位置等的网站 我已经达到了我想提供字体选择的程度 我可以动态加载字体而不是一次性加载所有字体吗 例如 用户输入文本并选择使用 通用字体 1 是否可以使用 jquery 加载该字体 这样我就可
  • 如何使用 puppeteer 使用 x/y 坐标单击元素?

    我一直在尝试弄清楚如何使用 puppeteer 中的 x 和 y 坐标单击页面上的按钮 但我无法让它工作 这就是我目前正在使用的 await page mouse click x y button left 没有发生错误 它只是没有单击任何
  • 数据表中的自定义分页

    我有一个网络应用程序 在其中我从数据库获取数据并显示在数据表中 我在执行此操作时遇到问题 因为我获取的数据行太多 200 000 所以当我查询类似的东西时select from table name 我的应用程序卡住了 有没有办法用 Jav
  • Django UserCreationForm 自定义字段

    我正在尝试创建用户注册表单并添加一些自定义字段 为此 我对 UserCretionForm 进行了子类化并添加了字段 如 django 文档中所示 然后我根据这个表单创建了基于函数的视图和模板 现在 我可以成功创建用户 并且该用户已按预期添
  • jQuery - 使用 .getHours() 方法将 1-24 小时更改为 1-12 小时?

    Fiddle http jsfiddle net bnsex 1 http jsfiddle net bnsex 1 我想在这段代码中使用 12 小时制 document ready function setInterval functio
  • Java byte[] 到字符串转换输出字节

    在我的代码中 我通过互联网发送一个编码为字节数组的 txt 文件 然后在另一端将消息转换回并显示它 问题是 当我尝试显示它时 它总是显示为 B 1ef9f1d 或 B 1764be1 等 这是接收数据的地方 private void par
  • C语言UART通信(十六进制)

    我想向写入函数发送一个十六进制值 例如 0 90 这是因为需要通信的设备接收到的是十六进制数的命令 未使用的变量在测试时出现 并注释为丢失十六进制值 稍后将被删除 如何编写具有字符串以外的十六进制值的写入函数 对于初学者 请告诉我们如何通过
  • Ransack:如何使用不同的别名多次连接表?

    假设我有 items 与 has many 与 properties 关联 那么我可以像这样搜索具有名称为 a name 和值 a value 的属性的所有项目 q properties name eq a name properties