ActiveRecord:如何找到所有孩子都符合条件的父母?

2024-03-26

假设我有一个Parent模型有很多Child, 然后Child也属于OtherParent.

我怎样才能找到全部Parent其中所有的Child属于任何OtherParent?

在纯 SQL 中我可以做

Parent.find_by_sql(<<SQL)
  SELECT *
  FROM parents p
  WHERE NOT EXISTS (
    SELECT *
    FROM children
    WHERE parent_id = p.id
      AND other_parent_id IS NULL
  )
SQL

(from here https://stackoverflow.com/questions/6430761/rails-how-to-query-for-all-the-objects-whose-every-association-have-an-attribut),但如果可能的话,我更愿意利用 ActiveRecord 来做到这一点。

Thanks!


我正在使用 Rails 4.2.1 和 PostgreSQL 9.3


Using arel可以让你走得很远。棘手的部分是如何不使用编写整个查询arel自己的查询语法?

这是一个技巧:使用以下命令构建查询时where,如果你使用arel有条件的话,你可以免费获得一些额外的方法。例如,您可以使用以下命令尾部子查询.exists.not,这将为您带来(NOT ( EXISTS (subquery)))把它扔进父母的where- 条款,你就准备好了。

问题是,如何引用涉及的表?为此你需要阿雷尔。你could使用阿雷尔的where及其丑陋的条件,例如a.eq b。但为什么?由于它是一个相等条件,因此您可以使用 Rails 的条件来代替!您可以使用哈希键引用要查询的表,但对于其他表(在外部查询中),您可以使用其arel_table。看这个:

parents = Parent.arel_table
Parent.where(
  Child.where(other_parent_id: nil, parent_id: parents[:id]).exists.not
)

您甚至可以通过稍微求助于字符串并依赖于可以将子查询作为 Rails 的参数提供的事实来减少 Arel 的使用where。它没有太多用处,但它不会强迫您过多地研究 Arel 的方法,因此您可以使用该技巧或其他采用子查询的 SQL 运算符(还有其他吗?):

parents = Parent.arel_table
Parent.where('NOT EXISTS (?)',
  Child.where(parent_id: parents[:id], other_parent_id: nil)
)

这里的两个要点是:

  • 您可以像构建常规查询一样构建子查询,使用 Arel 引用外部查询的表。它甚至可能不是一个真正的表,它可能是一个别名!疯狂的事情。
  • 您可以使用子查询作为 Rails 的参数where方法就好了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ActiveRecord:如何找到所有孩子都符合条件的父母? 的相关文章

  • 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
  • 忽略 git 中的本地配置文件

    Rails 应用程序中有一些本地文件 属于我们存储库的一部分 我希望 git 忽略它们 基本上 我希望 git 忽略我对 config environments 目录和 config application rb 文件中的任何内容所做的所有
  • Rails:format.js 或 format.json,或两者?

    可能很明显 但我仍然缺乏基本知识 那么在控制器内部 两者都可以使用 还是总是 Javascript 所以两者是相同的 json and js是两种不同类型的响应 它们在 Rails 中被定义为不同的 MIME 类型 Mime Type re
  • 多态控制器和调用对象

    我的地址具有多态关系 可以由成员或依赖者拥有 一切看起来都很棒 直到我意识到除非我遗漏了一些东西 否则我不知道创建它的对象是什么类型 有没有办法告诉路由文件包含对象的类型 Models class Member lt ActiveRecor
  • 用数字 1-1000 填充 Postgres 数据库?

    我是 pgAdmin3 的新手 我想用数字 1 1000 填充 pgAdmin3 中的数据库 我该怎么做呢 目前 我创建了一个名为 MyDatabase 的数据库 其中没有任何内容 每行应与其数值相对应 第 1 行应包含 1 第 2 行应包
  • Postgres 平均值计算忽略 null

    这是我的 postgres 表 name revenue John 100 Will 100 Tom 100 Susan 100 Ben 5 rows 在这里 当我计算平均收入时 它返回 100 这显然不是这种情况 而总和 计数 即 400
  • 使用 Ajax 在输入时提交 Textarea,然后渲染部分内容而不刷新整个页面

    目前我正在尝试通过 JS 和 Ajax 在没有提交按钮的情况下发表评论 并且它有效 问题是当帖子提交时 页面重新加载到 post id comment页面 我希望它呈现部分内容 而不是刷新整个页面或将我带到不同的页面 我对 JS 不熟悉 任
  • git push heroku master 权限被拒绝

    我正在关注 ruby railstutorial 我运行命令 git push heroku master 它吐出了这个错误 Permission denied publickey fatal Could not read from rem
  • 为什么“捆绑”会在我的开发机器上安装生产 gem?

    Gemfile 说 gem sqlite3 groups gt development test gem mysql2 group gt production 然而当我打字时bundle install在我的开发机器上安装了所有 gem 我
  • 在rails中,如何将记录作为csv文件返回

    我有一个名为 Entries 的简单数据库表 class CreateEntries lt ActiveRecord Migration def self up create table entries do t t string firs
  • Postgres 中 -Infinity 和 Infinity 的适当值

    在一种情况下 我们必须在 Postgres DB 中存储 无穷大和 无穷大的值 应该考虑什么合适的值 如果没有 请建议最合适的替代方案 你实际上可以使用 infinity and infinity for FLOAT4 and FLOAT8
  • 在 docker 中将 pgadmin 连接到 postgres

    我有一个docker compose与服务文件python nginx postgres and pgadmin services postgres image postgres 9 6 env file env volumes postg
  • JPA 和 PostqreSQL:长字符串持久化

    谁能告诉我如何使用 JPA 保存长文本 我使用 PostgreSQL 这是我在类中定义很长字符串的方法 Lob private String body 然而 这会产生一个类型的字段字符变化 255 在数据库中 此外 我尝试使用 Column
  • 手动更改postgresql中查询的执行计划?

    是否可以在postgresql中手动更改执行计划的操作顺序 例如 如果我总是想在过滤之前进行排序操作 尽管这在 postgresql 的正常使用中没有意义 是否可以通过例如手动强制执行该操作改变运营的内部成本 如果我实现自己的功能呢 是否可
  • 多重要求和允许强参数rails 4

    在下面的情况下 我尝试使用强参数 我想要求email address password并允许remember me fields 但像下面这样使用它只允许最后一行在方法示例中 在下面的情况下 它只需要params permit rememb
  • Ruby on Rails:如何使用 TCP 套接字连接 GPS 设备

    ruby 2 3 0p0 2015 12 25 修订版 53290 x86 64 linux 轨道 4 2 4 我正在使用 cloud9 IDE 和 webrick 服务器 我的项目是实时跟踪GPS 我想使用TCP连接与GPS跟踪设备进行通
  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • 最近邻居的 Postgis SQL

    我正在尝试计算最近的邻居 为此 我需要传递一个参数来限制与邻居的最大距离 例如 半径1000米内最近的邻居是哪些 我做了以下事情 我用数据创建了表 id name latitude longitude 之后 我执行了以下查询 SELECT
  • PostgreSQL:使用for循环迭代表行,根据当前行检索列值

    我有以下2张表 CREATE TABLE salesperson t salespersonid numeric 4 0 NOT NULL salespersonname character varying 25 salespersonte

随机推荐

  • 如何在 PHP 中调试多个会话?

    我正在开发一个项目 其中应用程序在开发模式下通过网络创建对同一应用程序的 Web 服务请求 以获得虚假数据和更好的开发环境 有时 当我调试时 我发现很难做到这一点 因为当您在同一个 PHP 安装上同时有两个调试会话时 XDebug 似乎不起
  • window.scrollTo 不滚动到提供的 id

    我正在处理一个文档文件 当单击 id about 的锚点时 我想滚动到 id projectpage 的所需部分 a class nav link page scroll href About Me a section 我尝试使用 a ab
  • 如何在发布过程中跳过文件夹删除?

    我无法做到这一点 因此从 Visual Studio 发布不会删除服务器网站上的 App Data 文件夹 但我也希望它继续删除所有文件 该文件夹除外 以保持目录 干净 我已经在 csproj pubxml 中尝试过这个 以及它的更改 有一
  • iOS 4 构建 SDK

    我昨天安装了 iOS 4 SDK 我之前安装过 3 1 2 3 1 3 和 3 2 SDK 自从安装了 iOS 4 SDK 以来 我在 Xcode 中只有 3 2 和 4 0 可用 当我加载针对旧版本 例如 3 1 2 的 Xcode 项目
  • Actionscript 3 数学不一致

    我正在尝试在 Flex actionscript 3 中构建一个计算器 但使用 Math 类得到了一些奇怪的结果 trace 1 4 4 should be 1 but it is 0 9999999999999999 trace 1 5
  • 选择按午夜时间分组的数据

    我有一个像这样的表 ID TIMEVALUE 1 06 07 15 06 43 01 000000000 2 06 07 15 12 17 01 000000000 3 06 07 15 18 21 01 000000000 4 06 07
  • 使用recvfrom()和sendto()发送结构

    我在用C语言这是一个共同平台对于服务器和客户端 我有一个特定类型的结构 我想将其从服务器发送到客户端 For e g 服务器代码 necessary declarations struct hostent hp hp gethostbyna
  • MySQL 时区查询

    我有两个字段 time scan start and time scan end 时间戳字段 当我使用 PDO 打开与 MySQL 的连接时 我使用SET NAMES utf8 time zone 0 00 现在 当我在 MySQL 中执行
  • 多方面散点图ggplot2中不同的x和y轴尺度

    我用过lemon封装有ggplot2使用以下代码绘制带有回归和置信区间线的多方面散点图 library tidyverse library lemon Plotting ggplot data calibration aes Observe
  • dask 中不支持项目分配的解决方法

    我正在尝试将我的代码库从 numpy 数组转换为 dask 因为我的 numpy 数组超出了Memory Error限制 但是 我发现可变数组的功能尚未实现dask arrays所以我得到了 NotImplementedError Item
  • 谁能给我解释一下 C++ 异常规范吗?

    谁能解释一下 C 中使用的异常规范 它们什么时候使用 我很少看到它在代码中使用 使用异常规范的优点和缺点 优点 缺点 是什么 它们什么时候使用 我很少看到它在代码中使用 希望永远不会 因为它们在明年标准化的下一版本 C 中已被弃用 使用异常
  • 如何修复错误“您可能需要适当的加载程序来处理此文件类型”

    我有一个全新的 Laravel 安装 关于使用编译文件npm run dev VUE我收到文件错误 您可能需要适当的加载程序来处理此文件类型 当前没有配置加载程序来处理此文件 Laravel 版本 8 12 包 json devDepend
  • Facebook 评论镜像不起作用

    我一步一步做了这些 创建一个新的 Facebook 应用程序 应用程序 ID 544557495732050 创建一个新的 Facebook 页面 https www facebook com Pasha Electronic 502844
  • 每秒(或更短时间)检查 url 是否有效的最佳方法是什么,在 C# 窗口窗体应用程序 (.NET) 中使用 Task wait 或 ContinueWith

    我是 C Net 和 Visual Studio 2022 的新手 我想要实现的是每秒运行一个计时器来检查网站 url 是否有效 是否已启动 如果 url 可访问并且当前 WebView2 未显示该网站 那么它应该导航到该网站 如果它已经显
  • TypeScript 泛型:无效、从不或未定义? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 总是想知道这个问题 所以想要得到一个明确的答案并将其固定下来 我想做的是让编译器 语言服务 阅读器知道T应该什么都没有 空的 虚无 我想知道
  • 跨计算机快速同步 git 工作区

    我有一个使用 git 的个人项目 我经常在多台计算机上进行 hack 托管在 Github 上 因为我在家做这件事 所以经常被打扰 我正在发表声明 晚餐已经准备好了 否则我需要换尿布 当我重新开始编码时 我可能会使用另一台计算机 获取最新版
  • 如何在 iPhone 的自定义 UIView 上启用 UIDragInteraction

    我一直在尝试使用 Apple 的新 API 来启用自定义 UIView 上的拖动交互 我在使用 iPad 进行测试时成功地使其工作 但是当我在 iPhone 7 ios 11 beta 3 中运行相同的应用程序时 我无法拖动我的自定义 UI
  • SQL Server:将 bool 转换为整数

    为什么查询 SELECT CAST column LIKE string AS INT 100 return 关键字 AS 附近的语法不正确 因为 bool 不是 T SQL 中的类型 它不存在 布尔表达式不是位类型 他们不have类型 仅
  • 如何在 Polymer 1.0 中过滤铁列表?

    The dom repeat元素提供了一个filter属性 有没有类似的过滤方法iron list 例如 给定一个人员列表 我想过滤出生在特定城市的人 As iron list不幸的是不提供filter属性 没有声明性模式使这成为可能 您可
  • ActiveRecord:如何找到所有孩子都符合条件的父母?

    假设我有一个Parent模型有很多Child 然后Child也属于OtherParent 我怎样才能找到全部Parent其中所有的Child属于任何OtherParent 在纯 SQL 中我可以做 Parent find by sql lt