2013-05-24 21 views
6

Câu hỏi này tương tự/liên quan đến câu hỏi tràn ngăn xếp khác về Looking up all the descendants of a class in Ruby. Một câu hỏi tuyệt vời đầy đủ các thông tin mà tôi đang tìm kiếm - trừ khi tôi thả xuống thành một đường ray console:ActiveSupport :: DescendantsTracker.descendants không trả về hậu duệ

irb(main):001:0> ActiveSupport::DescendantsTracker.descendants(Object) 
=>[] 
irb(main):002:0> ObjectSpace.each_object(Class).select { |klass| klass < Object } 
=> [IRB::Notifier::AbstractNotifier, IRB::Notifier::ErrUnrecognizedLevel, ...] 

Vì vậy, tại sao không ActiveSupport :: DescendantsTracker trả lại hậu duệ của đối tượng? Sự khác biệt trong việc thực hiện là gì? Số điện thoại documentation for DescendantsTracker gợi ý rằng:

Mô-đun này cung cấp triển khai nội bộ để theo dõi hậu duệ nhanh hơn lặp qua ObjectSpace.

Nhanh hơn? Ok, nó phải nhanh hơn để trả lại không có gì so với cái gì đó (phải không?), Nhưng nó phải trả về hậu duệ của lớp được cung cấp.

Trả lời

2

ActiveSupport::DescendantsTracker.descendants(Object) sẽ trở về trống trong bảng điều khiển của bạn vì bảng điều khiển phát triển không biên dịch ứng dụng của bạn, nó chưa tải tất cả các lớp và do đó không biết về chúng để xuất chúng!

Hãy nhìn vào câu hỏi này: RoR: MyModel.descendants returns [] in a view after the first call?

+0

Tôi đã đọc các bài liên quan và tôi vẫn không nhận được nó . Làm cách nào để kiểm tra chức năng này? Tôi đã thử thiết lập 'config.cache_classes = true' trong config \ development.rb thành không có hiệu lực ... – erroric

+1

Bạn đã thử khởi tạo trong câu trả lời không được chấp nhận? 'Dir [Rails.root + 'ứng dụng/mô hình/*. Rb']. Bản đồ {| f | File.basename (f, '. *'). Camelize.constantize} ' – Matt

+0

Tại sao tôi cần tải các mô hình của ứng dụng để xem con cháu của Object? Không nên ray đã biết về họ? Nếu tôi tham khảo tên lớp trong giao diện điều khiển, không đường ray không sau đó tải đối tượng đó? – erroric

2

Bạn cần phải tải háo hức các lớp học, như đã nói ở: https://github.com/rails/rails/issues/3364

ActionDispatch::Reloader.to_prepare do 
    Rails.application.eager_load! 
end 
+0

Thú vị ... đọc qua vấn đề đường ray - đưa ra một câu chuyện thú vị về vấn đề này. Tôi tin rằng việc sử dụng 'ActionDispatch :: Reloader ...' là dành cho máy chủ rails trong chế độ dev, nhưng giải pháp cho giao diện điều khiển dường như đơn giản gọi là 'Rails.application.eager_load!'. Tôi sẽ thử cả hai. – erroric

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