Chính xác thì Arel trong Rails 3.0 là gì?


86

Tôi hiểu rằng nó là một sự thay thế cho ActiveRecord và nó sử dụng các đối tượng thay vì các truy vấn.

Nhưng...

tại sao điều này tốt hơn?

các đối tượng / truy vấn sẽ dễ tạo hơn?

nó sẽ dẫn đến các truy vấn SQL hiệu quả hơn?

nó sẽ tương thích với tất cả các DB chính? - Tôi cho rằng nó sẽ làm được.

nó sẽ dễ dàng / khó sử dụng hơn với các thủ tục được lưu trữ?

Câu trả lời:


182

Chính xác thì Arel trong Rails 3.0 là gì?

Đó là một mô hình đối tượng cho đại số các toán tử truy vấn quan hệ.

Tôi hiểu rằng nó là một sự thay thế cho ActiveRecord

Không, không phải vậy. Nó thay thế cho các truy vấn SQL thủ công trong chuỗi. Nó là một lớp truy vấn phổ biến làm nền tảng cho ActiveRecord, nhưng nó cũng có thể được sử dụng làm nền tảng cho DataMapper chẳng hạn.

Nếu đó là sự thay thế cho bất cứ thứ gì, thì đó là sự thay thế cho Ambition. Hoặc, bạn có thể coi nó như một phiên bản Ruby của các toán tử truy vấn chuẩn LINQ hoặc SQLAlchemy của Python. (Trên thực tế, tác giả trích dẫn rõ ràng cả LINQ và SQLAlchemy là nguồn cảm hứng.)

Hoặc, bạn có thể xem nó như một sự thay thế cho named_scopes. Trên thực tế, ARel hiện thực hóa ý tưởng rằng "mọi truy vấn đều là một named_scope". Và, whaddayaknow: cả hai đều được viết bởi cùng một người.

và nó sử dụng các đối tượng thay vì các truy vấn.

Không, nó sử dụng các đối tượng làm truy vấn.

tại sao điều này tốt hơn?

Ruby là một ngôn ngữ hướng đối tượng, không phải là một ngôn ngữ hướng chuỗi. Vì lý do đó một mình , nó làm cho tinh thần để đại diện cho các truy vấn như các đối tượng thay vì chuỗi. Xây dựng mô hình đối tượng thích hợp cho các truy vấn thay vì sử dụng chuỗi cho mọi thứ mang lại cho bạn khá nhiều lợi ích giống như việc xây dựng mô hình đối tượng thích hợp cho hệ thống kế toán thay vì sử dụng chuỗi cho mọi thứ mang lại cho bạn.

Một lợi thế lớn khác là ARel thực hiện một đại số thực tế của các toán tử truy vấn. Nói cách khác, ARel biết về các quy tắc toán học để xây dựng và soạn thảo các truy vấn. Nếu bạn nối hai chuỗi, mỗi chuỗi chứa một truy vấn SQL hợp lệ, kết quả có thể không phải là một truy vấn SQL hợp lệ. Hoặc, thậm chí tệ hơn, đó một truy vấn SQL hợp lệ, nhưng một truy vấn không có ý nghĩa hoặc thực hiện điều gì đó hoàn toàn khác với những gì bạn nghĩ. Điều này không bao giờ có thể xảy ra với ARel. (Đây là ý nghĩa của bài viết mà tôi liên kết đến dưới đây với "đóng dưới bố cục".)

các đối tượng / truy vấn sẽ dễ tạo hơn?

Đúng. Ví dụ, như tôi đã đề cập ở trên, việc xây dựng các truy vấn phức tạp hơn từ các phần đơn giản sẽ dễ dàng hơn nhiều.

nó sẽ dẫn đến các truy vấn SQL hiệu quả hơn?

Đúng. Thực tế là ARel có một mô hình đối tượng thích hợp cho các truy vấn có nghĩa là nó có thể thực hiện tối ưu hóa các truy vấn đó rất lâu trước khi tạo ra một truy vấn SQL thực sự.

nó sẽ tương thích với tất cả các DB chính? - Tôi cho rằng nó sẽ làm được.

Đúng. Trên thực tế, tôi đã luôn nói về SQL ở trên, nhưng thực sự một đại số truy vấn quan hệ có thể tạo ra các truy vấn cho khá nhiều thứ. Một lần nữa, hãy xem LINQ hoặc Ambition làm ví dụ: cả hai đều có thể truy vấn SQL, LDAP, ActiveResource, CouchDB, Amazon, Google,… tất cả đều có cùng một cú pháp.

Có lẽ cuộc thảo luận tốt nhất về ARel là gì và tại sao Nick Kallen viết là bài báo được đặt tên một cách khéo léo Why Arel? của chính Nick Kallen . Lưu ý: bài viết có chứa một số biệt ngữ nhẹ về toán học và khoa học máy tính, nhưng đó chính xác là vấn đề: ARel có một số nền tảng vững chắc trong toán học và khoa học máy tính, những nền tảng đó chính là thứ tạo nên đặc tính mạnh mẽ của nó.


Câu trả lời xuất sắc. Tôi đã đọc liên kết bạn đăng và theo dõi nó trong hầu hết các phần. Trên thực tế, phần comp sci có ý nghĩa nhưng cách nó được kết hợp vào đường ray là nơi tôi gặp vấn đề. Đối với tôi, nó có ý nghĩa hơn nhiều khi nó thay thế SQL được làm thủ công (hoặc bất cứ thứ gì) và do đó AR được xây dựng dựa trên nó trong 3.0. Tôi đã nhận được những ấn tượng khác nhau đối với những người nên biết rõ hơn và câu trả lời này rất tuyệt vời trong cách giải thích đơn giản và chính xác cho từng câu hỏi ở trên.
Sẽ

Tôi có một câu hỏi tiếp theo. Bạn đã đề cập đến LDAP, AMZ, v.v. ở trên, tôi cho rằng hiện tại (dựa trên rails / arel trên github) ARel không có khả năng đó, chỉ là tiềm năng? tức là cho đến khi ai đó thực hiện phần đó. Điều này nghe có vẻ cực kỳ thú vị.
Sẽ

2
@Will - Tôi nghĩ bạn sẽ phải đợi ai đó phát triển những khả năng thú vị hơn đó. Hoặc tự mình bẻ khóa, bạn có cần nó không?
Mike Woodhouse

1
+1, mặc dù liên kết đã chết; tìm kiếm ngây thơ không tìm thấy liên kết hiện tại.
Dave Newton

@DaveNewton: Rõ ràng, nó đã biến mất. Có một số bản sao cache nổi xung quanh, ví dụ như bmark.us/bmark/readable/913ff84fc0dcdc
Jörg W Mittag

19

ARel, không may bị ràng buộc trực tiếp với việc tạo SQL và do đó không phù hợp với nhu cầu của DataMapper.

Theo cách tôi sẽ hiểu thì ARel là một mô hình truy vấn rõ ràng cho ActiveRecord tạo và tối ưu hóa các truy vấn SQL cho RDBMS.

Mặt khác, DataMapper là một trình ánh xạ chính hãng cho dữ liệu và có thể giao tiếp với các kho lưu trữ dữ liệu không quan hệ. Trong tương lai DataMapper có thể sẽ bao gồm một thư viện riêng có tên là Veritas, nhằm cung cấp chức năng quan hệ cho dữ liệu có nguồn gốc từ BẤT KỲ kho dữ liệu nào, không chỉ RDBMS.


2
Tại sao điều này nhận được -1?
Jeriko

10
Tôi là người bảo trì DataMapper, và những gì người ta nói là đúng. ARel, trong cách triển khai hiện tại, không thể được sử dụng bên dưới DataMapper vì nó chỉ cung cấp một tập hợp con các chức năng cần thiết để hoạt động với hơn 40 kho dữ liệu mà DM hỗ trợ. IMHO việc triển khai hiện tại được kết hợp chặt chẽ với thế hệ SQL và sẽ mất rất nhiều công việc để sửa các API / nội bộ để hoạt động với các kho dữ liệu về cơ bản khác với RDBMS. ARel là một bước tiến, nhưng nó không thể tạo nền tảng cho nhiều hơn ActiveRecord vào lúc này.
dkubb

1

Arel trong Rails 3 tạo các đối tượng quan hệ mà db không được truy vấn cho đến khi bạn cần. Hiệu quả hơn nhiều.

Nó cũng tự nhiên hơn (khi bạn đã quen với nó) đây thực sự là điểm mạnh tuyệt vời của Rails.


0

Trên thực tế, tôi đã bắt đầu một loạt video về ActiveRelation.

Hướng dẫn chung đầu tiên có thể được xem tại http://Innovative-Studios.com/#pilot


Tôi cũng thích video. Đó là loại cơ bản, nhưng tôi đã thu thập thêm một vài thông tin mới. Muốn xem các video tiếp theo!
Purplejacket,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.