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_scope
s. 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, đó là 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ó.