Apa sebenarnya Arel di Rails 3.0 itu?


86

Saya memahami bahwa ini adalah pengganti ActiveRecord dan menggunakan objek, bukan kueri.

Tapi...

mengapa ini lebih baik?

akankah objek / kueri "lebih mudah" dibuat?

apakah ini akan menghasilkan kueri SQL yang lebih efisien?

apakah itu akan kompatibel dengan semua DB utama? - Saya kira itu akan.

apakah akan lebih mudah / lebih sulit untuk digunakan dengan prosedur tersimpan?

Jawaban:


182

Apa sebenarnya Arel di Rails 3.0 itu?

Ini adalah model objek untuk aljabar operator kueri relasional.

Saya mengerti bahwa ini adalah pengganti ActiveRecord

Tidak, tidak. Ini adalah pengganti untuk kueri SQL yang dibuat dengan tangan dalam string. Ini adalah lapisan kueri umum yang mendasari ActiveRecord, tetapi juga dapat digunakan sebagai pendukung untuk DataMapper, misalnya.

Jika itu adalah pengganti untuk apa pun, itu adalah pengganti Ambisi. Atau, Anda dapat menganggapnya sebagai versi Ruby dari operator kueri standar LINQ atau SQLAlchemy Python. (Faktanya, penulis secara eksplisit mengutip LINQ dan SQLAlchemy sebagai inspirasi.)

Atau, Anda dapat melihatnya sebagai pengganti named_scopes. Faktanya, ARel adalah realisasi dari gagasan bahwa "setiap kueri adalah named_scope". Dan, whaddayaknow: keduanya ditulis oleh orang yang sama.

dan menggunakan objek, bukan kueri.

Tidak, ini menggunakan objek sebagai kueri.

mengapa ini lebih baik?

Ruby adalah bahasa berorientasi objek, bukan bahasa berorientasi string. Untuk alasan itu saja , masuk akal untuk merepresentasikan kueri sebagai objek, bukan string. Membangun model objek yang tepat untuk kueri alih-alih menggunakan string untuk semuanya memberi Anda manfaat yang hampir sama dengan membangun model objek yang tepat untuk sistem akuntansi daripada menggunakan string untuk semuanya memberi Anda.

Keuntungan besar lainnya adalah ARel mengimplementasikan aljabar sebenarnya dari operator kueri. Dengan kata lain, ARel tahu tentang aturan matematika untuk membangun dan menyusun kueri. Jika Anda menggabungkan dua string, yang masing-masing berisi kueri SQL yang valid, hasilnya mungkin tidak akan menjadi kueri SQL yang valid. Atau, lebih buruk lagi, ini adalah kueri SQL yang valid, tetapi tidak masuk akal, atau melakukan sesuatu yang sama sekali berbeda dari yang Anda pikirkan. Ini tidak akan pernah terjadi dengan ARel. (Inilah arti dari artikel yang saya tautkan di bawah dengan "komposisi tertutup".)

akankah objek / kueri "lebih mudah" dibuat?

Iya. Misalnya, seperti yang saya sebutkan di atas, jauh lebih mudah untuk membuat kueri yang lebih kompleks dari bagian yang lebih sederhana.

apakah ini akan menghasilkan kueri SQL yang lebih efisien?

Iya. Fakta bahwa ARel memiliki model objek yang tepat untuk kueri berarti bahwa ARel dapat melakukan pengoptimalan pada kueri tersebut jauh sebelum menghasilkan kueri SQL yang sebenarnya.

apakah itu akan kompatibel dengan semua DB utama? - Saya kira itu akan.

Iya. Sebenarnya, saya selalu berbicara tentang SQL di atas, tetapi sebenarnya aljabar kueri relasional dapat menghasilkan kueri untuk hampir semua hal. Sekali lagi, lihat LINQ atau Ambition sebagai contoh: keduanya dapat melakukan kueri SQL, LDAP, ActiveResource, CouchDB, Amazon, Google,… semuanya dengan sintaks yang sama.

Mungkin diskusi terbaik tentang apa itu ARel dan mengapa Nick Kallen menulis adalah artikel yang diberi nama tepat Mengapa Arel? oleh Nick Kallen sendiri. Catatan: artikel tersebut berisi beberapa jargon matematika dan ilmu komputer ringan, tetapi itulah intinya: ARel memiliki beberapa dasar yang kuat dalam matematika dan ilmu komputer, dasar-dasar itulah yang memberikan sifat-sifatnya yang kuat.


Jawaban yang sangat bagus. Saya telah membaca tautan yang Anda posting dan mengikutinya untuk sebagian besar. Sebenarnya bagian comp sci masuk akal tetapi bagaimana itu dimasukkan ke dalam rel adalah di mana saya mengalami masalah. Lebih masuk akal bagi saya bahwa ini menggantikan SQL buatan tangan (atau apa pun) dan dengan demikian AR dibangun di atasnya di 3.0. Saya mendapatkan kesan berbeda untuk orang-orang yang seharusnya tahu lebih baik dan jawaban ini sangat bagus dalam penjelasan yang sederhana dan tepat untuk setiap pertanyaan di atas.
Apakah

Saya punya satu pertanyaan lanjutan. Anda sebutkan LDAP, AMZ, dll. Diatas, saya berasumsi bahwa saat ini (berdasarkan rails / arel di github) ARel tidak memiliki kemampuan itu, hanya potensinya? yaitu sampai seseorang menerapkan bagian itu. Ini memang terdengar sangat menarik.
Akankah

2
@ Will - Saya pikir Anda harus menunggu seseorang untuk mengembangkan kemampuan funkier tersebut. Atau coba sendiri, haruskah Anda membutuhkannya?
Mike Woodhouse

1
+1, meskipun tautannya mati; pencarian naif tidak menemukan tautan saat ini.
Dave Newton

@DaveNewton: Rupanya, itu hilang. Ada beberapa salinan cache yang beredar, misalnya bmark.us/bmark/readable/913ff84fc0dcdc
Jörg W Mittag

19

ARel, sayangnya terikat langsung untuk menghasilkan SQL dan dengan demikian tidak sesuai untuk kebutuhan DataMapper.

Cara saya mengatakannya adalah bahwa ARel adalah model kueri eksplisit untuk ActiveRecord yang menghasilkan dan mengoptimalkan kueri SQL untuk RDBMS.

DataMapper di sisi lain adalah pemeta asli untuk data, dan dapat berinteraksi dengan penyimpanan data non-relasional. Di masa mendatang DataMapper kemungkinan akan menyertakan pustaka terpisah yang disebut Veritas, yang dimaksudkan untuk menyediakan fungsionalitas relasional ke data yang bersumber dari penyimpanan data APA PUN, bukan hanya RDBMS.


10
Saya adalah pengelola DataMapper, dan apa yang dikatakan ilmu pengetahuan itu benar. ARel, dalam implementasinya saat ini, tidak dapat digunakan di bawah DataMapper karena hanya menyediakan subset fungsionalitas yang diperlukan untuk bekerja dengan 40+ datastore yang didukung DM. IMHO implementasi saat ini terkait erat dengan generasi SQL, dan akan membutuhkan banyak pekerjaan untuk memperbaiki API / internal untuk bekerja dengan datastore yang secara substansial berbeda dari RDBMS. ARel adalah sebuah langkah maju, tetapi ARel tidak dapat membentuk fondasi lebih dari ActiveRecord saat ini.
dkubb

1

Arel di Rails 3 membuat objek relasi di mana db tidak ditanyai sampai Anda membutuhkannya. Jauh lebih hemat.

Ini juga lebih alami (setelah Anda terbiasa) yang merupakan kekuatan besar Rails.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.