2009-12-23 50 views
8

Như tôi đã nói trong bài trước, ứng dụng Rails của chúng tôi phải giao tiếp với một loại bảng E-A-V trong ứng dụng của bên thứ ba mà chúng tôi đang lấy dữ liệu từ đó. Tôi đã tạo Chế độ xem để làm cho dữ liệu bình thường nhưng nó mất quá nhiều thời gian để chạy. Chúng tôi đã có một trong những nhà phát triển PHP ra nước ngoài của chúng tôi tạo ra một thủ tục lưu trữ để giúp tăng tốc độ nó lên.Sử dụng thủ tục lưu sẵn trong Rails

Bây giờ chúng tôi gặp phải sự cố mà chúng tôi cần gọi thủ tục được lưu trữ này từ ứng dụng Rails, cũng như cung cấp tìm kiếm và lọc. Khung nhìn có thể làm điều này bởi vì Rails đã xem nó như một mô hình Rails truyền thống. Làm thế nào tôi có thể làm điều này với proc được lưu trữ? Chúng ta có cần phải viết tìm kiếm và đặt hàng tùy chỉnh (chúng tôi đang sử dụng Searchlogic) không? Quản lý không có khả năng hiểu được những hạn chế của việc sử dụng một proc được lưu trữ từ Rails; tất cả những gì họ nói là phương pháp hiện tại mất quá nhiều thời gian để tải dữ liệu và cần được sửa, nhưng tìm kiếm và lọc là các chức năng quan trọng.

EDIT Tôi đã đăng mã cho truy vấn này tại đây: Optimizing a strange MySQL Query. Điều gì là buồn cười là khi tôi chạy truy vấn này trong một GUI (Navicat) nó chạy trong khoảng 5 giây, nhưng trên trang web phải mất hơn một phút để chạy; xem là phức tạp vì lý do tôi phác thảo trong bài gốc nhưng tôi sẽ nghĩ rằng MySQL tối ưu hóa và lưu trữ các khung nhìn giống như SQL Server (hoặc đúng hơn, cách tôi đọc SQL Server) để cải thiện hiệu suất.

+2

Sử dụng thủ tục lưu sẵn với Rails âm thanh xấu ... Bạn không thể tìm cách khác để cải thiện thời gian tải? – marcgg

+0

Đồng ý với marcgg ... bạn có thể cung cấp thông tin để chúng tôi có thể nghĩ ra các cách khác để cải thiện hiệu suất không? – Ben

+0

Tôi đồng ý rằng tình huống cụ thể này nghe có vẻ xấu xa, tuy nhiên đây là một câu hỏi hay, trong đó, bạn không phải lúc nào cũng có quyền kiểm soát cơ sở dữ liệu. – jamesaharvey

Trả lời

4

Bạn có thể gọi thủ tục được lưu trữ từ Rails, nhưng bạn sẽ mất hầu hết các lợi ích của ActiveRecord, vì SQL được tạo tiêu chuẩn sẽ không hoạt động. Bạn có thể sử dụng kết nối cơ sở dữ liệu riêng và gọi nó, nhưng nó sẽ là một trừu tượng bị rò rỉ. Bạn có thể muốn xem xét DataMapper.

Nhìn lại câu hỏi cuối cùng của bạn, tôi sẽ yêu cầu DBA tạo trình kích hoạt để tạo cấu trúc quan hệ hơn từ dữ liệu. Trình kích hoạt sẽ chèn dữ liệu EVA vào một bảng, đó là cách duy nhất tôi biết để làm các khung nhìn vật chất hóa trong MySQL. Bằng cách này, bạn chỉ phải trả một chi phí nền gia tăng nhỏ khi chèn và ứng dụng có thể chạy bình thường.

Dù sao ...

ActiveRecord::Base.connection.execute("call SP_name (#{param1}, #{param2}, ...)") 

Nhưng có một open ticket out there on lighthouse cho thấy phương pháp này có thể không làm việc với ra thay đổi một số các thông số để sử dụng kết nối.

Các vấn đề liên quan