Using database views for performance wins in Rails
Database views## Một database view là tập hợp các kết quả của một truy vấn được lưu trữ mà người dùng có thể truy vấn giống như đang trong một kết nối cơ sở dữ liệu liên tục. Với rails, model thừa kế từ ActiveRecord::Base sẽ không quan tâm tới đối tượng collection tương ứng là một bảng hay view, ...
Database views##
Một database view là tập hợp các kết quả của một truy vấn được lưu trữ mà người dùng có thể truy vấn giống như đang trong một kết nối cơ sở dữ liệu liên tục. Với rails, model thừa kế từ ActiveRecord::Base sẽ không quan tâm tới đối tượng collection tương ứng là một bảng hay view, điều này giúp cho ứng dụng có thể gọi ra những truy vấn logic vào database và khiến cho việc viết code đơn giản hơn.
class Foo < ActiveRecord::Base # table "foos" end class Bar < ActiveRecord::Base # view "bars" end
Lấy một ví dụ đơn giản của Twitter đó là dịch vụ tin nhắn. Trên màn hình trang chủ của người dùng đăng nhập vào hệ thống, họ sẽ thấy một danh sách những tin từ người dùng mà họ theo dõi kèm theo nội dung của tin nhắn, thêm vào đó là tên người dùng và ảnh đại diện của người dùng đó. Giả định là tin nhắn được lưu lại vào bảng messages và thông tin người dùng lấy trong bảng users
class User < ActiveRecord::Base has_many :messages End class Follow < ActiveRecord::Base belongs_to :follower, class_name: "User" belongs_to :target, class_name: "User" end class Message < ActiveRecord::Base belongs_to :user end
Khi bạn muốn lấy lên những tin nhắn để hiển thị đế tới người dùng đăng nhập vào hệ thống, trước hết chúng ta sẽ phải load lên những user mà người đó theo dõi, tiếp theo là tập những tin nhắn và với mỗi tin nhắn, chúng ta sẽ lấy ra user quan hệ tương ứng với tin nhắn đó để hiển thị thông tin tên và ảnh đại diện người dùng. Chúng ta có thể tạo một model mới UserMessage để lưu giữ thông tin cho mỗi tin nhắn và thông tin người dùng được hiển thị cho tin nhắn ấy
class UserMessage < ActiveRecord::Base self.primary_key = "message_id" end
Chúng ta cũng cần một migration để tạo ra view tương ứng đó
CREATE VIEW user_messages AS SELECT u.username, u.id AS user_id, m.content, m.id AS message_id FROM messages m INNER JOIN users u ON u.id = m.user_id
Trong trường hợp này, dữ liệu có thể rất hiệu quả trong các thực hiện unions, intersections và tính toán hơn là mapping các đối tượng để thực thi cùng một hành động.
Tham khảo###
Using Rails and SQL Views for a Report
Using database views in Rails