Rails 3.0'da Arel tam olarak nedir?


86

ActiveRecord'un yerini aldığını ve sorgular yerine nesneler kullandığını anlıyorum.

Fakat...

bu neden daha iyi?

nesnelerin / sorguların oluşturulması "daha kolay" olacak mı?

daha verimli SQL sorgularına yol açacak mı?

tüm büyük DB'lerle uyumlu olacak mı? - Olacağını varsayıyorum.

saklı yordamlarla kullanmak daha kolay / daha zor olacak mı?

Yanıtlar:


182

Rails 3.0'da Arel tam olarak nedir?

İlişkisel sorgu operatörlerinin bir cebiri için bir nesne modeli.

ActiveRecord'un yerine geçtiğini anlıyorum

Hayır, değil. Dizelerdeki el yapımı SQL sorgularının yerine geçer. ActiveRecord'un temelini oluşturan ortak bir sorgu katmanıdır , ancak örneğin DataMapper için bir destek olarak da kullanılabilir.

Herhangi bir şeyin yerini alacaksa, Ambition'ın yerine geçer. Veya, bunu LINQ standart sorgu operatörlerinin bir Ruby sürümü veya Python'un SQLAlchemy'si olarak düşünebilirsiniz. (Aslında, yazar ilham olarak hem LINQ hem de SQLAlchemy'den açıkça alıntı yapıyor.)

Veya, named_scopes yerine bir tane olarak görebilirsiniz . Aslında ARel, "her sorgunun bir named_scope" olduğu fikrinin hemen hemen farkındadır . Ve whaddayaknow: ikisi de aynı kişi tarafından yazılmıştır.

ve sorgular yerine nesneler kullandığını.

Hayır, nesneleri sorgu olarak kullanır .

bu neden daha iyi?

Ruby, dizgeli bir dil değil, nesne yönelimli bir dildir. Yalnızca bu nedenle , sorguları dizeler yerine nesneler olarak göstermek mantıklıdır. Her şey için dizeler kullanmak yerine sorgular için uygun bir nesne modeli oluşturmak, her şey için dizeler kullanmak yerine bir muhasebe sistemi için uygun bir nesne modeli oluşturmanın size sağladığı faydaların hemen hemen aynısını sağlar.

Diğer bir büyük avantaj, ARel'in gerçek bir sorgu operatörleri cebirini uygulamasıdır . Diğer bir deyişle, ARel, sorgu oluşturma ve oluşturmanın matematiksel kurallarını bilir. Her biri geçerli bir SQL sorgusu içeren iki dizeyi birleştirirseniz, sonuç büyük olasılıkla geçerli bir SQL sorgusu olmayacaktır. Ya da, daha da kötüsü, bu ise geçerli bir SQL sorgusu, ancak mantıklı değil bir, ya da sen öyle düşündüğün tamamen farklı bir şey yapar. ARel ile bu asla olmaz. (Aşağıda bağlantı verdiğim makale "kompozisyon altında kapalı" anlamına geliyor.)

nesnelerin / sorguların oluşturulması "daha kolay" olacak mı?

Evet. Örneğin, yukarıda da bahsettiğim gibi, daha basit kısımlardan daha karmaşık sorgular oluşturmak çok daha kolaydır.

daha verimli SQL sorgularına yol açacak mı?

Evet. ARel'in sorgular için uygun bir nesne modeline sahip olması, gerçek bir SQL sorgusu oluşturmadan çok önce bu sorgular üzerinde optimizasyonlar gerçekleştirebileceği anlamına gelir.

tüm büyük DB'lerle uyumlu olacak mı? - Olacağını varsayıyorum.

Evet. Aslında, yukarıda hep SQL'den bahsettim, ama aslında ilişkisel bir sorgu cebiri hemen hemen her şey için sorgular üretebilir. Örnek olarak yine LINQ veya Ambition'a bakın: her ikisi de SQL, LDAP, ActiveResource, CouchDB, Amazon, Google,… hepsi aynı sözdizimiyle sorgulayabilir.

ARel'in ne olduğu ve Nick Kallen'in neden yazdığına dair belki de en iyi tartışma, uygun bir şekilde adlandırılmış Neden Arel? Nick Kallen tarafından . Not: Makale bazı hafif matematiksel ve bilgisayar bilimleri jargonu içeriyor, ancak tam da bu nokta: ARel'in matematik ve bilgisayar bilimlerinde bazı güçlü temelleri var, bu temeller ona güçlü özelliklerini veren şeylerdir.


Mükemmel cevap. Gönderdiğiniz bağlantıyı okudum ve çoğunlukla takip ettim. Aslında, bilişim bilimi kısmı mantıklıydı, ancak bunun raylara nasıl dahil edildiği, problemleri yaşadığım yerdi. El yapımı SQL'in (veya her neyse) yerini alması ve dolayısıyla AR'nin 3.0'da bunun üzerine inşa edilmesi bana çok daha mantıklı geliyor. Daha iyi bilmesi gereken insanlar için farklı izlenimler ediniyordum ve bu cevap, yukarıdaki her sorunun basit ve kesin açıklamasıyla mükemmel.
Will

Bir takip sorum var. Yukarıda LDAP, AMZ, vs.'den bahsetmiştiniz, sanırım şu anda (github üzerindeki raylara / arele dayalı olarak) ARel'in bu kabiliyeti yok, sadece potansiyeli var mı? yani birisi bu bölümü uygulayana kadar. Bu kulağa çok heyecan verici geliyor.
Will

2
@Will - Bence birinin bu eğlenceli yetenekleri geliştirmesini beklemeniz gerekecek. Ya da tek başına bir çatlak al, ihtiyacın var mı?
Mike Woodhouse

1
+1, bağlantı kesilmiş olmasına rağmen; saf arama mevcut bağlantıyı bulamadı.
Dave Newton

@DaveNewton: Görünüşe göre gitmiş. Etrafta dolaşan bazı önbelleğe alınmış kopyalar var, örneğin bmark.us/bmark/readable/913ff84fc0dcdc
Jörg W Mittag

19

ARel, maalesef doğrudan SQL oluşturmaya bağlıdır ve bu nedenle DataMapper'ın ihtiyaçları için uygun değildir.

Arel, RDBMS'ler için SQL sorguları oluşturan ve optimize eden ActiveRecord için açık bir sorgu modelidir.

Öte yandan DataMapper, veriler için gerçek bir eşleştiricidir ve ilişkisel olmayan veri depolarıyla zaten arayüz oluşturabilir. Gelecekte, DataMapper'ın, sadece RDBMS'lerden değil HERHANGİ bir veri deposundan elde edilen verilere ilişkisel işlevsellik sağlaması amaçlanan Veritas adlı ayrı bir kitaplık içermesi muhtemeldir.


10
DataMapper'ın geliştiricisiyim ve knowtheory'nin söylediği şey doğrudur. ARel, mevcut uygulamasında DataMapper altında kullanılamaz çünkü yalnızca DM'nin desteklediği 40'tan fazla veri deposu ile çalışmak için gereken işlevselliğin bir alt kümesini sağlar. IMHO, mevcut uygulama SQL üretimine sıkı sıkıya bağlıdır ve bir RDBMS'den önemli ölçüde farklı veri depolarıyla çalışmak için API / dahili öğelerin düzeltilmesi çok fazla çalışma gerektirecektir. ARel ileriye doğru bir adımdır, ancak şu anda ActiveRecord'dan fazlası için bir temel oluşturamaz.
dkubb

1

Arel in Rails 3, ihtiyacınız olana kadar db'nin sorgulanmadığı ilişki nesneleri yapar. Çok daha verimli.

Aynı zamanda daha doğaldır (alıştıktan sonra) bu gerçekten Rails'in en büyük gücüdür.


0

Aslında ActiveRelation üzerine bir video dizisi başlattım.

İlk genel eğitici http://Innovative-Studios.com/#pilot adresinde görüntülenebilir.


Ben de videoyu beğendim. Biraz basitti, ancak birkaç parça ekstra yeni bilgi topladım. Sonraki videoları görmek ister misiniz!
Purplejacket
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.