arel

rails's arel at master - GitHub


Arel is a Relational Algebra for Ruby. It 1) simplifies the generation complex of SQL queries and it 2) adapts to various RDBMS systems. It is intended to be a framework framework; that is, you can build your own ORM with it, focusing on innovative object and collection modeling as opposed to database compatibility and query generation.

「Relational Algebra」を辞書でひくと「関係代数(の演算子)」と出てきますが、arelはRDBMSのクエリを簡単に記述する為のライブラリです。使い方のイメージとしては、LINQ to SQLが一番近いと思います。ドキュメントには、


The long term goal, following both LINQ and DataMapper, is to have Arel adapt to engines beyond RDBMS, including XML, IMAP, YAML, etc.

と書かれてます。

arelを動かそうと思ったのですが、0.1.0はgemで入るもののうまく動かなかったので、0.1.3で試しました。0.1.3はactivesupport(3.0.pre)に依存してる為、Dr Nic ’s First look at rails 3.0.preを見て3.0.pre環境を作成しています。

script/consoleで動かしてみました。

>> require 'arel'
=> []
>> tickets = Table(:tickets)
=> #<Arel::Table:0xb796f5c0 @engine=#<Arel::Sql::Engine:0xb7803e84 @ar=ActiveRecord::Base>, @name="tickets">
>> tickets.where(tickets[:name].matches("test%")).each do |t|
>? puts t[tickets[:name]]
>> end

上記のように、SQLを気にすることなくオブジェクトの集合に対して処理を行うことができます。

ただ、値の取得に関する記述(t[tickets[:name]])や、下記に示すようにレコードの関連を使おうとすると、その記述はまだ冗長なカンジがします。

>> tickets.join(categories).on(tickets[:category_id].eq(categories[:id])).where(categories[:name].matches("%2"))\
.each do |t|
?> puts t[tickets[:name]]
>> end

LINQ to SQLは仕事で使っていたのですがとても便利でした。arelも同じくらい使い勝手が良くなるポテンシャルがあると思います。