Arel:来自 Arel::SelectManager 的带有 join 的活动关系

2024-01-29

让我们有一个 Rails 4.2.x 应用程序,我们有两个表 posts 和authors,我们想使用 Arel 来获取由 name == 'Karl' 的作者撰写的帖子。 (在本例中,我们可以对 Active Record 连接感到满意,但这只是为了使示例保持简单。)

posts = Arel::Table.new :posts
authors = Arel::Table.new :authors

my_query = posts.project(Arel.star)
                .join(authors)
                .on(posts[:author_id].eq(authors[:id]))
                .where(authors[:name].eq('Karl'))

> my_query.class
=> Arel::SelectManager

现在我们可以通过执行以下操作来获取帖子数组(Array 类):

> Post.find_by_sql my_query
[master]  Post Load (3.1ms)  SELECT * FROM "posts" INNER JOIN "authors"
                             ON "posts"."author_id" = "authors"."id"
                             WHERE "authors"."name" = 'Karl'

=> [#<Post:0x005612815ebdf8
    id: 7474,
    ...
   ]

所以我们确实得到了一组帖子,而不是活动记录关系:

 > Post.find_by_sql(my_query).class
 => Array

同时将管理器注入 Post.where 也行不通

> Post.where my_query
=> #<Post::ActiveRecord_Relation:0x2b13cdc957bc>
> Post.where(my_query).first
ActiveRecord::StatementInvalid: PG::SyntaxError:
ERROR:  subquery must return only one column
SELECT  "posts".* FROM "posts"
WHERE ((SELECT * FROM "posts" INNER JOIN "authors" ON "posts"."author_id" = "authors"."id" WHERE "authors"."name" = 'Karel'))
ORDER BY "posts"."id" ASC LIMIT 1

我想我一定错过了什么。简而言之:如何从像上面的 my_query 这样的选择管理器(或完成相同操作的另一个选择管理器)获取活动记录关系。


您无法从 Arel::SelectManager 获取 ActiveRecord::Relation,也无法从 sql 字符串获取 ActiveRecord::Relation。有两种方法可以通过 ActiveRecord 加载数据:

  1. 在 Arel 中执行所有查询逻辑。在这种情况下,您无法使用任何 ActiveRecord::Relation 方法。但你在 Arel 中有相同的功能。在您的示例中,您可以通过 Arel 设置限制:

    my_query.take(10)
    
  2. 另一种方法是在 ActiveRecord::Relation 方法中使用 Arel。您可以像这样重写您的查询:

    posts = Arel::Table.new :posts
    authors = Arel::Table.new :authors
    
    join = posts.join(authors).
              on(posts[:author_id].eq(authors[:id])).
              join_sources
    
    my_query = Post.
                  joins(join).
                  where(authors[:name].eq('Karl'))
    
    > my_query.class
    => ActiveRecord::Relation
    

在这种情况下你可以使用my_query作为 ActiveRecord::Relation

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

Arel:来自 Arel::SelectManager 的带有 join 的活动关系 的相关文章

随机推荐

  • 在 C# 中将字典绑定到 DataGridView?

    我有一个字典项目如下 Dictionary
  • 比较模型,有人可以给我一个例子吗?

    型号比较 这是meshlab的一个功能 meshlab 的网络主页中有一个简短的介绍 http www meshlab net http www meshlab net 但如何呢 没有例子 有人可以帮助我吗 给一个文档的例子 非常感谢 正如
  • 缓解 R for Windows 中的反斜杠问题

    在我的 R 生活早期 当涉及到目录和子目录之间的分隔符时 我发现 R 和 Windows 位于不同页面上的痛苦 尽管我知道这个问题 但我仍然对必须手动在所有反斜杠前面放置反斜杠或将它们全部替换为正斜杠感到痛苦 我喜欢使用计算机上运行的多个应
  • 等待使用协程绑定服务

    所以我有一个绑定到服务的方法 fun bindService val intent Intent this BluetoothService class java bindService intent serviceConnection C
  • Mac selenium webdriver chrome 窗口始终以小窗口开始

    我在使用 chrome 和 selenium 2 webdriver 时遇到问题 问题是 当我使用 chromedriver 启动浏览器会话时 它总是在一个小于可用屏幕宽度一半的窗口中启动 因为我正在对随屏幕尺寸变化而变化的页面进行测试 所
  • 使用 WP_Query 仅显示库存产品中的 WooCommerce

    我有这个代码 它显示了最好的销售 但它也显示了没有库存的产品 我如何修改代码 以便它只显示有库存的产品 谢谢 best sellers args array post type gt product meta key gt total sa
  • Doctrine2 - 列在刷新之前更改为 null

    我正在尝试在数据库中插入新的对象 行 该对象是这样创建的 nodeaccess new Nodeaccess A by doctrine2 generated entity nodeaccess gt setAccesslevel 0 no
  • 使用 Swift Generics 识别子类适用于自定义类,但不适用于 UITapGestureRecognizer

    我想在 swift 中做一些事情 但我不知道如何实现它 那就是删除给定类类型的手势识别器 这是我的代码 和示例 我在 Xcode 7 beta 中使用 swift 2 0 5 我有 3 个继承自 UITapGestureRecognizer
  • 从入口点动态选择在主机上运行 Docker 的用户 GUI 和 UID

    我有以下脚本作为我的 Dockerfile 和 Docker 映像的入口点 bin bash set e Setup permissions data dir var www html usermod u 1000 www data gro
  • Powershell 添加成员。添加一个 ArrayList 成员?

    Powershell add member 命令非常有用 我用它来向自定义对象添加属性 有时我将一个成员设置为一个数组来保存多个对象 是否可以将 ArrayList 添加为自定义对象的成员 想象一下文章列表具有属性 索引 标题 和 关键字
  • 定义 uint64_t 常量的最佳/正确方法

    constexpr auto v static cast
  • 使用 python requests 模块时发生 LocationValueError

    我一直使用 requests 包与网络交互 过去没有遇到任何问题 最近 当我使用一个大约一周没有使用的脚本时 我在执行例程时遇到了以下错误requests get call LocationValueError No host specif
  • 向 ASP MVC 操作添加基本身份验证

    我有一个 ASP MVC 应用程序 它使用它自己的自定义身份验证机制 但是 一个控制器中只有一项操作需要使用基本身份验证进行保护 这个想法是 当点击这个特定操作的 URL 时 浏览器会弹出基本身份验证对话框 然后我需要在操作本身中输入用户名
  • 无限的游戏背景

    我正在开发一个 Java 项目来模拟直升机在框架中的飞行 直升机使用箭头键在屏幕上移动 我希望直升机能够无限移动 即当直升机到达画面边缘时 背景应该向相反的方向移动 以具有无尽地形的效果 这是我到目前为止的代码 import java aw
  • C# 中服务器端文件大小的限制

    我目前正在 MVC4 中上传文件 但在我的控制器中 我尝试将文件大小限制为最大 4MB 但收到以下警告 comparison to integral constant is useless using Haacks http haacked
  • python Ghostscript不关闭输出文件

    我正在尝试将一页或多页的 PDF 文件转换为每页的图像 这很像在这里找到的问题 https stackoverflow com questions 331918 converting a pdf to a series of images
  • iOS 推送通知:找不到有效连接

    我正在尝试在本地解析服务器上设置推送通知 尝试发送推送时出现此错误 parse server push adapter APNS cannot find vaild connection for 9a86 21 每个安装设备令牌都会重复该错
  • 如何从 Ant 将参数传递给 Junit 测试?

    我在Ant下使用Junit执行Selenium测试 我的测试用例需要读取文件 其中包含测试数据 以完成数据驱动测试 我不介意在测试用例中嵌入文件名 但我想知道该文件所在的目录的名称 数据文件参数化存储在 build xml 文件中 将此类信
  • 从泛型函数中的枚举获取 rawValue

    2015 年 8 月 28 日更新 这将在 Swift 2 中得到解决 See Swift 编译器开发人员在 Twitter 上的回应 https twitter com evermeer status 636791736191320064
  • Arel:来自 Arel::SelectManager 的带有 join 的活动关系

    让我们有一个 Rails 4 2 x 应用程序 我们有两个表 posts 和authors 我们想使用 Arel 来获取由 name Karl 的作者撰写的帖子 在本例中 我们可以对 Active Record 连接感到满意 但这只是为了使