2010-07-30 35 views
5

Tôi biết rằng bạn có thể làm một cái gì đó như thế này để nạp môi trường đường ray:ActiveRecord Migration & Rake không tải các mô hình?

task :my_task => :environment do 
    MyModel.find(1) 
    end 

Nhưng có vẻ như các mã trong các mô hình không được thực thi. Tôi đang sử dụng actions_as_audited, và có một hàm lớp tốt đẹp mà lấy tất cả các mô hình đang được kiểm toán. Cuộc gọi trông giống như sau:

Audit.audited_classes 

Và để xác định một mô hình như là có thể kiểm tra, bạn chỉ cần thêm dòng này vào mô hình của bạn:

acts_as_audited 

Khi audited_classes được thực hiện trong giao diện điều khiển, tôi nhận được một loạt các tất cả các lớp được kiểm tra của tôi; tuy nhiên, khi tôi thực hiện nó từ bên trong một nhiệm vụ cào (hoặc di chuyển), tôi nhận được một mảng trống.

[EDIT]

Sau khi chơi xung quanh một chút nữa, tôi nhận thấy rằng nếu các mô hình không thực sự nạp cho đến khi họ được tham chiếu (ví dụ: tải lười biếng). Tôi nghĩ rằng việc thiết lập cache_classes thành true trong cấu hình sẽ sửa lỗi này, nhưng chúng vẫn có vẻ lười biếng.

Một giải pháp có thể là lặp qua tất cả các mô hình (như được giải thích trong bài đăng này: Is there a way to get a collection of all the Models in your Rails app?) nhưng điều đó có vẻ hơi khó hiểu và tôi hy vọng có một cách rõ ràng hơn.

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

Cảm ơn

Trả lời

1

Bạn có thể thêm config/môi trường/development.rb:

Dir[Rails.root.join('app', 'models', '**/*')].each { |file| File.basename(file, '.rb').camelize.constantize } 
+0

Yea ... Tôi đã được làm điều đó, nhưng một hack của nó ... Tôi nộp một vé ở đây: https://github.com/rails/rails/issues/5148 – gmoniey

+0

điều này không hoạt động với các mô hình không gian tên, tôi không nghĩ. bạn đã bao giờ chạy vào một usecase không gian tên? – jay

1

Điều này xảy ra khi bạn có config.threadsafe! trong môi trường sản xuất, tự động đặt config.dependency_loading = false. Điều này ngăn cản đường ray tải các lớp mô hình của bạn trong các tác vụ rake.

Cách để giải quyết vấn đề này là đặt "config.dependency_loading = true nếu $ rails_rake_task" trong tệp môi trường của bạn. Ví dụ, trong production.rb của tôi, tôi có:

config.threadsafe! 
config.dependency_loading = true if $rails_rake_task 

hoặc bạn cũng có thể làm

config.threadsafe! unless $rails_rake_task 
Các vấn đề liên quan