当前位置: 首页 > 面试题库 >

Arel:使用符号的左外部联接

储承
2023-03-14
问题内容

我有一个用例,其中我从某个模型中获得了符号化的深层关联,并且我必须执行某些涉及使用外部联接的查询。没有手工编写完整的SQL怎么办?

我不想要的答案:-使用include(无法很好地解决深层关联(.includes(:cars => [:windows,:engine =>
[:ignition]
.....出乎意料的工作))而我却没有不想产生副作用)-自己编写SQL(对不起,这是2013年,支持跨html" target="_blank">数据库等,而我获取的对象是只读的,副作用更多)

我想要一个Arel解决方案。我知道,使用模型中的arel_table可以构造SQL表达式,还有一个DSL用于联接,但是以某种方式我不能在模型的joins方法中使用它:

car = Car.arel_table
engine = Engine.arel_table

eng_exp = car.join(engine).on(car[:engine_id].eq(engine[:id]))
eng_exp.to_sql #=> GOOD! very nice!
Car.joins(eng_exp) #=> Breaks!!

为什么这不起作用超出了我。我不知道到底缺少什么。但这是我现在所拥有的解决方案中最接近的东西。如果有人可以帮助我完成我的示例,或者为我提供一个不错的解决方法,或者告诉我Rails何时包含如此明显必要的功能,将不胜感激。


问题答案:

我发现了一个博客文章,旨在解决此问题:http :
//blog.donwilson.net/2011/11/constructing-a-less-than-simple-query-with-
rails-and-arel/

基于此(以及我自己的测试),以下应适用于您的情况:

car = Car.arel_table
engine = Engine.arel_table

sql = car.project(car[Arel.star])
        .join(engine, Arel::Nodes::OuterJoin).on(car[:engine_id].eq(engine[:id]))

Car.find_by_sql(sql)


 类似资料:
  • 问题内容: 我不了解左外部联接,右外部联接的概念,或者根本不理解为什么我们需要使用联接!我正在努力解决的问题以及正在处理的表格在这里:链接 问题3(b) 在SQL中构造命令以解决以下查询,解释了为什么必须使用(外部)联接方法。[5分]“找到每名工作人员及其his属(如果有)的姓名” 问题3(c)- 使用(i)join方法和(ii)子查询方法在SQL中构造命令以解决以下查询。[10分]“查找在计算机

  • 问题内容: 我有一个网站,用户可以在其中查看电影列表,并为其创建评论。 用户应该能够看到所有电影的列表。此外,如果他们查看了电影,则他们应该能够看到他们给它的评分。如果不是,则仅显示没有得分的电影。 他们根本不在乎其他用户提供的分数。 考虑以下 我本质上想要的是 考虑以下内容: 两个测试都应打印完全相同的输出,但是,只有原始版本会吐出正确的结果表: orm会返回这个 任何试图加入其余主题的尝试,那

  • 问题内容: 很容易理解为什么左外部联接不是可交换的,但是我很难理解它们是否是可交换的。几家在线资源表明不是,但我还没有说服自己就是这种情况。 假设我们有三个表:A,B和C。 令A包含ID和B_ID两列,其中ID是表A的主键,B_ID是与表B的主键相对应的外键。 令B包含两列ID和C_ID,其中ID是表B的主键,C_ID是与表C的主键相对应的外键。 让C包含ID和VALUE两列,其中ID是表C的主键

  • 为什么我不能在SELECT部分执行NULL测试?有办法解决这个问题吗?

  • 问题内容: 我有这些表, 和。我想执行左外部联接。 劳斯莱斯 推出 SUMing,JOINing和GROUPings之后的预期输出==> 我的代码: 但是上面代码的O / P是 我不知道我要去哪里错了-你能解释一下吗? 问题答案: 您没有做错任何事。这就是JOIN的行为 它是左边的行数X右边的行数,在您的情况下为3 x 2 = 6。 试试这个 SQLFiddle 我知道这不适用于SQL Serve

  • 我正在尝试JPA2.1(eclipselink)中的“treat as”函数,但遇到了一个来自JPA的错误: 异常说明:ReportQuery结果大小不匹配。应为[263],但已检索到[197] 下面是我的JPQL查询(我更改了一些部分,以便更明确): 我们可以看到account和ad_account之间的左外部连接。此外,ad_account表不存在于select子句中。(idApp字段是主键的