2015-01-08 19 views
6

Tôi cần biết lý do tại sao eager_load được ưu tiên là false trong môi trường không sản xuất? Một trong những lý lẽ mà tôi đã nghe nói rằng eager_load tải háo hức hầu hết Rails và ứng dụng trong bộ nhớ. Do đó việc sử dụng eager_load cho từng thử nghiệm làm cho nó chạy chậm hơn. Tuy nhiên, điều này đặt ra một số câu hỏi như chạy thử nghiệm như thế nào mà không tải Rails và mã liên quan đến ứng dụng? Rails và mã liên quan đến ứng dụng đang được nạp sẵn là gì? config.eager_load_namespaces cung cấp cho các loại sau đây:Tác động của eager_load = true là gì?

ActiveSupport ActionDispatch ActiveModel ActionView ActionController ActiveRecord ActionMailer Jquery::Rails::Engine MyApp::Application

Có phải tất cả các lớp học và các lớp con của họ đang háo hức nạp?

Những nhược điểm rõ ràng khi sử dụng eager_load = false trong môi trường phát triển hoặc thử nghiệm là gì?

Trả lời

3

Tuy nhiên điều này đặt ra một số câu hỏi như chạy thử nghiệm như thế nào mà không tải Rails và mã liên quan đến ứng dụng?

Thử nghiệm tải mã cần thiết khi có nhu cầu sử dụng. Vì vậy, ví dụ trên một số dòng mã thử nghiệm muốn sử dụng lớp Active::Record. Với eager_load được đặt thành false lớp này không bắt buộc, điều này sẽ dẫn đến ngoại lệ đối với chương trình ruby ​​ruby. Tuy nhiên, trong dự án đường ray, thử nghiệm sẽ yêu cầu Active::Record theo yêu cầu khi sử dụng nó. Vì vậy, vào cuối một thử nghiệm chạy nhanh hơn, bởi vì chỉ có các phần mã cần thiết đã được yêu cầu.

Kỹ thuật này là trái ngược với eager_loading và nó được gọi là autoloading

gì là Rails và ứng dụng mã đang được háo hức được nạp liên quan?

Kiểm tra https://github.com/rails/rails. Đó là một nhóm nhân viên.

Tất cả các lớp này và các lớp con của chúng có được tải nhanh không?

những nhược điểm rõ ràng của việc sử dụng eager_load = false trong phát triển hoặc thử nghiệm môi trường là gì?

Trong môi trường phát triển, nó có lợi thế và thực hành tốt nhất khi bạn có thời gian khởi động nhanh hơn (bỏ qua khi sử dụng trình tải trước như lò xo). Có lẽ nó cũng dễ dàng hơn cho việc tải lại thay đổi trong số các tùy chọn cache_classes=false, vì bạn có ít để tải lại (chỉ là một giả định).

Trong môi trường thử nghiệm đôi khi bạn không thể sử dụng eager_loading=false nếu bạn muốn ước tính một số chỉ số mã như mã vùng hoặc kiểm tra kiểu. Ví dụ. simple_cov yêu cầu bạn phải eager_load tất cả mã trước khi bắt đầu kiểm tra. Và nói chung nó có thể xảy ra rằng một số libarary không thể được sử dụng với eager_loading bởi vì nó làm một số khởi tạo trên tải một lớp mà đã có sẵn ngay cả trước khi gọi nó là phương pháp. Tuy nhiên đây là một trường hợp phía sau, có nói rằng, nó đã xảy ra với chúng tôi với neo4j.rb đá quý

+0

ruby ​​autoload là khá riêng biệt với những gì được sử dụng cho mã ứng dụng trong phát triển (mặc dù nó được sử dụng cho mã khung công tác) –

0

Tải bằng ứng dụng làm cho đường ray tải tất cả ứng dụng của bạn khi khởi động làm tăng thời gian khởi động. Ví dụ nếu bạn chỉ muốn tải bảng điều khiển đường ray để kiểm tra hành vi của một mô hình thì bạn phải đợi cho tất cả các mô hình, bộ điều khiển vv tải ngay cả khi bạn chỉ muốn sử dụng một trong số chúng

+0

Điều này là chính xác, tuy nhiên nó không giải quyết các câu hỏi tác giả hoàn toàn –

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