ruby-on-rails 在Rails ActiveRecord中使用公用表表达式(CTE)

rt4zxlrg  于 2023-02-14  发布在  Ruby
关注(0)|答案(1)|浏览(154)

公共表表达式是不同RDBMS(PostgreSQL、MySQL、Oracle、SQLite3等)中的一种相当常见的做法,用于跨多个查询组件或出于某些其他目的多次执行相同的计算
我发现旧的gem postgres_ext有这样的功能。但是它没有被维护。而且它是Postgres特有的
有一些关于它的老问题,但是它们是关于特定的rails版本或特定的RDBMS或关于Arel

在Rails中使用WITH子句是否可以通过一些常见的方式使用AR?

zzwlnbp8

zzwlnbp81#

轨道7.1 x introduce x x with方法
它返回ActiveRecord::Relation

Post.with(posts_with_tags: Post.where("tags_count > ?", 0))
# WITH posts_with_tags AS (
#   SELECT * FROM posts WHERE (tags_count > 0)
# )
# SELECT * FROM posts

定义公用表表达式后,可以使用自定义FROM值或JOIN来引用它
x一个一个一个一个x一个一个二个x
使用Arel不仅可以传递AR,还可以传递SQL文本。
注意:应该非常小心以避免SQL注入漏洞。此方法不应该与包含未净化输入的不安全值一起使用

Post.with(popular_posts: Arel.sql("... complex sql to calculate posts popularity ..."))

要添加多个CTE,只需传递多个键值对

Post.with(
  posts_with_comments: Post.where("comments_count > ?", 0),
  posts_with_tags: Post.where("tags_count > ?", 0)
)

或链接多个.with调用

Post
  .with(posts_with_comments: Post.where("comments_count > ?", 0))
  .with(posts_with_tags: Post.where("tags_count > ?", 0))

相关问题