web-dev-qa-db-ja.com

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

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

だが...

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

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

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

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

ストアドプロシージャを使用する方が簡単/難しいでしょうか?

85
Will

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

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

ActiveRecordの代替品であることを理解しています

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

182
Jörg W Mittag

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

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

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

19
knowtheory

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

(慣れれば)より自然になり、Railsの優れた強みになります。

1
BServiss

実際、私はActiveRelationに関するビデオシリーズを始めました。

最初の一般的なチュートリアルは http://Innovative-Studios.com/#pilot で表示できます。

0
Snuggs