在 Rails 2014 裡面,有幾個精彩的 Talk,Advanced Arel: When ActiveRecord Just Isn't Enough 就是其一。
這個 Talk 的內容是在講如何使用 Arel 搭配 ActiveRecord 產生更複雜的 SQL Query。
Arel : Relational Algebra
背景介紹:
- ActiveRecord 是 Ruby on Rails 的 ORM。是世界上最強最智能的 ORM。
- Arel 是 ActiveRecord 的底層。
四年前 Ruby on Rails 突破了所有 ORM 只能用排列組合設計的盲點:
- 各種 SQL statement 排列組合
- 各種 RDMBS query 排列組合
試圖去突破:發明了一套強大的 SQL AST 引擎,用 Relational Algebra 去組 SQL Query。而這套引擎就是 Arel。
智能產生優化過的 SQL statement
有了 Arel,開發者可以輕易的用 ActiveRecord 組出 Query,而且是經過優化的 Query。
(比如說以前有一些條件是開發者必須要先撈資料先塞進記憶體,再塞進 ORM 的,在 Arel 時代只要下正確的 ActiveRecord 語法,ActiveRecord 會自動知道要用 subqury 去解決這件事 )。
讓 SQL statement 回到 Business Logic 層次
用 ActiveRecord 產生 SQL query,不僅可以讓原先的邏輯回到 Ruby 層次,容易維護之外。多數時候 ActiveRecord 甚至生出來的 query 比開發者自己想出來的還要高效許多。
( Arel 跟著 Rails 3.0 釋出,2010/8 )
但是,雖然有了智能的 ActiveRecord ,在許多的實戰領域裡面,開發者還是被逼著要用許多 handwriting 的 SQL statement。因為我們認為這些東西無法用 ActiveRecord 下出來。例如複雜的 join 或 Group。甚至以前的許多 NOT case。
ActiveRecord with Arel
這篇 Talk 就是要打破開發者原先的思維,許多人以為下 SQL Query 必須只能透過 ActiveRecord,事實上 ActiveRecord 「可以」吃 Arel 本身的語法 combine 在一起用。這場 Talk 就是教大家怎麼這樣用。展示了非常多寫法。
不過,雖然看了這麼多炫技,開發者可能還是會覺得哪裡不對勁!
多數的複雜 SQL statement 是從 Stackoverflow 上抄來的
如果我知道 SQL query 要怎下,毋庸置疑我就會用這些技巧去組啊。但很多時候問題是我根本不知道怎麼下出這些條件。都是到 Stackoverflow 神出來的,然後只會拿到一組 "it works" 的 SQL syntax。這些神解法我連邏輯都不知道怎組出來的,要怎麼 reverse 回來。
Scuttle.io
Well,這個 Talk 的作者說,他知道這件事,所以這場 Talk 其實只是為了要展示了他最近寫的一個工具 http://scuttle.io。
Scuttle.io 只有一個功能,「你貼 SQL statment,它幫你還原成 Arel 語法」。
當作者 Live Demo 展示完這個工具,全場幾百個 Developer 起立鼓掌了十幾秒。