ruby-on-rails - 在 AREL 中横向连接
问题描述
是否可以使用 AREL 获得与下面的 SQL (PG) 查询相同的结果?
SELECT (sd.subscription_data ->> 'id')::uuid FROM events qe
CROSS JOIN LATERAL jsonb_array_elements(subscriptions) AS sd(subscription_data)
WHERE sd.subscription_data ->> 'type' = 'Organization'
AND qe.slug = '#{event_slug}';
解决方案
是的,但它不漂亮
e = Arel::Table.new(:events)
sd = Arel::Table.new(:sd)
event_slug = 'event_slug'
join = Arel::Nodes::NamedFunction.new('json_b_array_elements',
[Arel::Nodes::SqlLiteral.new("subscriptions")])
.as(Arel::Nodes::NamedFunction.new('sd',
[Arel::Nodes::SqlLiteral.new("subscription_data")]).to_sql)
p = e.project(
Arel::Nodes::SqlLiteral.new(
Arel::Nodes::Grouping.new(
Arel::Nodes::InfixOperation.new('->>',
sd[:subscription_data],
Arel::Nodes::SqlLiteral.new("'id'"))).to_sql) << '::uuid'
).where(
Arel::Nodes::InfixOperation.new('->>',
sd[:subscription_data],
Arel::Nodes::SqlLiteral.new("'type'").eq(
Arel::Nodes::SqlLiteral.new("'Company'")
)
).and(e[:slug].eq(event_slug)))
p.join_sources << Arel::Nodes::StringJoin.new(
Arel::Nodes::SqlLiteral.new('CROSS JOIN LATERAL')) << join
p.to_sql
输出是
SELECT
([sd].[subscription_data] ->> 'id')::uuid
FROM
[events]
CROSS JOIN LATERAL json_b_array_elements(subscriptions) AS sd(subscription_data)
WHERE
[sd].[subscription_data] ->> 'type' = 'Company'
AND [events].[slug] = N'event_slug'"
推荐阅读
- c# - Datagridview 中的 C# e.RowIndex ArgumentOutOfRangeException
- java - Webclient 可以从 iso-8859-1 解码到 utf-8 吗?
- dynamics-crm - 在子网格中填充字段数据
- python - TypeError:无法推断类型的架构:
- python - 如何在 open3d 中提取相交体素?
- css - 动画不流畅
- ftp - DJANGO-STORAGES,PARAMIKO:全局连接连接失败
- mongodb - 如何使用 spring-data-mongodb 实现多租户
- cognos-10 - Cognos 10 框架管理器因“BMTUI2”错误而崩溃。'这个程序故障的根源是一个错误。关闭程序'
- sql-server - 如何根据在 SQL Server 中的另一列中运行总和截止值来选择一列中的值