2010-04-02 23 views
8

Hey, chúng tôi có một lớp học thư viện (lib/Mixpanel) mà các cuộc gọi công việc chậm như sau:Rails Chậm Job & Class Library

class Mixpanel 

    attr_accessor :options 
    attr_accessor :event 

    def track!() 
    .. 
    dj = send_later :access_api # also tried with self.send_later 
    .. 
    end 

    def access_api 
    .. 
    end 

Vấn đề là khi chúng ta chạy các công việc cào: công việc: chúng tôi nhận được như sau lỗi:

undefined method `access_api' for #<YAML::Object:0x24681b8> 

Bất kỳ ý tưởng nào?

+0

Có vẻ như công việc bị trì hoãn không biết về lớp thư viện của bạn vì vậy nó chỉ trở thành một YAML :: Object, xin lỗi tôi không biết làm thế nào bạn có thể làm cho nó tải lớp thư viện của bạn. – Corey

+0

Tôi nhận thấy rằng vấn đề này tồn tại với bất kỳ thứ gì không phải là mô hình 'ActiveRecord'. PORO của tôi là trong 'app/models' và bình thường, nó được tự động nạp bởi Rails. 'delay_job' dường như có vấn đề với nó, trừ khi tôi sử dụng giải pháp khởi tạo được mô tả dưới đây bởi Jonathan. –

Trả lời

15

Delayed_job luôn tự động tải các lớp ActiveRecord, nhưng nó không biết về các loại lớp khác (như lib) mà nó đã so khớp trong db dưới dạng YML. Vì vậy, bạn cần kích hoạt trình nạp lớp một cách rõ ràng cho chúng. Kể từ khi DJ khởi động môi trường Rails, chỉ đề cập đến bất kỳ phi AR marshaled lớp học trong một initializer:

(config/initializers/load_classes_for_dj.rb) 

Mixpanel 
+0

Cảm ơn bạn, điều này cũng đã giúp tôi! Lưu ý cho các mô-đun: sử dụng "include ModelName" – vfilby

2

Một Gotcha nhỏ, tôi theo gợi ý của Jonathan, nhưng tôi cần thêm một require trước tên lớp, vì vậy tôi 'd sử dụng điều này cho load_classes_for_dj.rb:

require 'mixpanel' 
Mixpanel 

Sau đó, nó hoạt động tốt!

+0

Có config.autoload_paths + =% W (# {config.root}/lib) trong config/application.rb sẽ yêu cầu tất cả các lớp trong lib trong trường hợp bạn có nhiều tệp require =) – Abdo