Rails 3.0のArelとは正確には何ですか?


86

ActiveRecordの代わりであり、クエリの代わりにオブジェクトを使用することを理解しています。

だが...

なぜこれが良いのですか?

オブジェクト/クエリは「簡単に」作成できますか?

それはより効率的なSQLクエリにつながりますか?

すべての主要なDBと互換性がありますか?-そうなると思います。

ストアドプロシージャでの使用は簡単/困難ですか?

回答:


182

Rails 3.0のArelとは正確には何ですか?

これは、リレーショナルクエリ演算子の代数のオブジェクトモデルです。

ActiveRecordの代わりになることを理解しています

いいえ、そうではありません。これは、文字列で手作りするSQLクエリに代わるものです。これはActiveRecordの基礎なる一般的なクエリレイヤーですが、たとえばDataMapperの基盤としても使用できます。

それが何かの代わりであるなら、それは野心の代わりです。または、LINQ標準クエリ演算子のRubyバージョンまたはPythonのSQLAlchemyと考えることもできます。(実際、著者はLINQとSQLAlchemyの両方をインスピレーションとして明示的に引用しています。)

または、named_scopesの代わりとして見ることができます。実際、ARelは、「すべてのクエリは」という考えをほぼ実現したものですnamed_scope。そして、whaddayaknow:両方とも同じ男によって書かれました。

クエリの代わりにオブジェクトを使用すること。

いいえ、オブジェクトクエリとして使用します。

なぜこれが良いのですか?

Rubyはオブジェクト指向言語であり、文字列指向言語ではありません。その理由だけで、クエリを文字列ではなくオブジェクトとして表すことは理にかなっています。すべてに文字列を使用する代わりにクエリに適切なオブジェクトモデルを構築すると、すべてに文字列を使用する代わりに会計システムに適切なオブジェクトモデルを構築するのとほぼ同じ利点が得られます。

もう1つの大きな利点は、ARelがクエリ演算子の実際の代数を実装することです。言い換えると、ARelは、クエリを作成および作成するための数学的規則について知っています。それぞれに有効なSQLクエリが含まれている2つの文字列を連結すると、結果はおそらく有効なSQLクエリにはなりません。または、さらに悪いことに、それ有効なSQLクエリです、意味がないか、またはあなたが思っていることとはまったく異なることをします。これはARelでは決して起こり得ません。(これは、以下にリンクする記事が「構成の下で閉じられた」という意味です。)

オブジェクト/クエリは「簡単に」作成できますか?

はい。たとえば、前述したように、単純なパーツからより複雑なクエリを作成する方がはるかに簡単です。

それはより効率的なSQLクエリにつながりますか?

はい。ARelがクエリに対して適切なオブジェクトモデルを持っているという事実は、実際のSQLクエリを生成するずっと前にそれらのクエリに対して最適化を実行できることを意味します。

すべての主要なDBと互換性がありますか?-そうなると思います。

はい。実際、私は常に上記のSQLについて話しましたが、実際には、リレーショナルクエリ代数はほとんどすべてのクエリを生成できます。繰り返しになりますが、例としてLINQまたはAmbitionを参照してください。どちらもSQL、LDAP、ActiveResource、CouchDB、Amazon、Googleなどをすべて同じ構文でクエリできます。

おそらく、ARelとは何か、そしてNick Kallenが書いた理由についての最良の議論は、適切な名前の記事、Why Arel?ニック・カレン自身による。注:この記事には、数学とコンピューターサイエンスの専門用語がいくつか含まれていますが、まさにそれがポイントです。ARelには、数学とコンピューターサイエンスの強力な基盤があり、それらの基盤が強力な特性をもたらします。


優れた答え。私はあなたが投稿したリンクを読み、ほとんどの部分をたどりました。実際、comp sciの部分は理にかなっていますが、それがレールにどのように組み込まれているかが問題でした。手作りのSQL(またはその他)に取って代わり、3.0ではARがその上に構築されていることは私にははるかに理にかなっています。私はもっ​​とよく知っているべき人々に対して異なる印象を持っていました、そしてこの答えは上記の各質問のその単純で正確な説明で素晴らしいです。
2010

フォローアップの質問が1つあります。上記でLDAP、AMZなどについて言及しましたが、現在(githubのrails / arelに基づいて)ARelにはその機能がなく、可能性があると思いますか?つまり、誰かがその部分を実装するまで。しかし、これは非常にエキサイティングに聞こえます。
2010

2
@ Will-誰かがそれらのファンキーな機能を開発するのを待つ必要があると思います。それとも、自分でひびを入れてください、あなたはそれが必要ですか?
マイクウッドハウス

1
+1、ただしリンクは無効です。ナイーブ検索で現在のリンクが見つかりませんでした。
デイブニュートン

@DaveNewton:どうやら、それはなくなっています。いくつかのキャッシュされたコピーが浮かんでいます。たとえば、bmark.us / bmark / reading / 913ff84fc0dcdc –JörgW
Mittag

19

ARelは、残念ながらSQLの生成に直接関係しているため、DataMapperのニーズには適していません。

私が言いたいのは、ARelはRDBMSのSQLクエリを生成して最適化するActiveRecordの明示的なクエリモデルであるということです。

一方、DataMapperはデータ用の本物のマッパーであり、すでに非リレーショナルデータストアとインターフェイスできます。将来、DataMapperには、Veritasと呼ばれる別のライブラリが含まれる可能性があります。これは、RDBMSだけでなく、任意のデータストアから供給されるデータにリレーショナル機能を提供することを目的としています。


2
なぜこれは-1を受け取ったのですか?
ジェリコ2010年

10
私はDataMapperのメンテナーであり、知識理論が言っていることは真実です。ARelは、現在の実装では、DMがサポートする40以上のデータストアを操作するために必要な機能のサブセットしか提供しないため、DataMapperの下では使用できません。IMHOの現在の実装はSQL生成と緊密に結合されており、RDBMSとは大幅に異なるデータストアで動作するようにAPI /内部を修正するには多くの作業が必要になります。ARelは一歩前進ですが、現時点ではActiveRecord以上の基盤を形成することはできません。
dkubb 2010年

1

Rails 3のArelは、必要になるまでdbが照会されないリレーションオブジェクトを作成します。はるかに効率的です。

それはまた、(慣れれば)より自然であり、これは本当にRailsの大きな強みです。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.