【问题标题】:Express a CTE using Arel使用 Arel 表达 CTE
【发布时间】:2018-02-27 10:35:20
【问题描述】:

我有这个 ActiveRecord 的 sn-p:

scope = Listing.where(Listing.arel_table[:price].gt(6_000_000))

生成的sql:

SELECT listings.* FROM listings where listings.price > 6000000

我想添加一个会导致此 sql 的 CTE:

WITH lookup AS (
    SELECT the_geom FROM lookup WHERE slug = 'foo-bar'
)

SELECT * from listings, lookup
WHERE listings.price > 6000000
AND ST_within(listings.the_geom, lookup.the_geom)

我想使用 ArelActiveRecord 来表达这个包含 CTE 的 sql。

我也想使用 scope 变量作为起点。

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord common-table-expression arel


    【解决方案1】:

    您可以像这样创建 CTE:

    lookup = Arel::Table.new(:lookup) # Lookup.arel_table
    cte = Arel::Nodes::As.new(lookup,
      lookup.where(lookup[:slug].eq('foo-bar')).project('the_geom'))
    

    然后将其与您的范围一起使用,例如:

    scope.with(cte)
    

    您可以在底部的Arel README 中看到一个示例

    【讨论】:

    • 尝试这个,它会导致缺少from。 IE。只是SELECT * FROM listings WHERE 不是SELECT * FROM listings, lookup WHERE
    • 通过添加 joins: scope.joins('CROSS JOIN lookup').with(cte) 得到这个工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多