2010-06-12 22 views
12

Tôi có một phương thức lớp được trộn lẫn với tất cả các kiểu máy của mình. phương thức được gọi khi lớp mô hình được đánh giá. Thật không may (đối với tôi), điều này dường như là theo yêu cầu, bất cứ khi nào mô hình là cần thiết trong env phát triển. làm thế nào có thể có đường ray tải tất cả các mô hình lúc khởi động? điều này có được khuyến khích không?Rails 3 tải tất cả các mô hình khi khởi động

class Foo < ActiveRecord::Base 
    include Acl 
    register_acl # i need this to be called for all models at start up 
end 

Về cơ bản, register_acl có một vài đối số về "hành động" mà mô hình muốn kiểm soát truy cập. Giả sử một trong những hành động của Foo là "quản lý" và hệ thống cần phải biết về hành động này khi khởi động. Tôi nghĩ trong mô hình là nơi tự nhiên nhất để có logic này.

cảm ơn bạn!

Trả lời

18

Cách đúng để làm ứng dụng rộng này là để bật cache_classes trong cấu hình của bạn. Theo mặc định nó tắt trong phát triển nhưng trên trong sản xuất.

Nếu bạn muốn làm điều đó thỉnh thoảng:

Rails.application.eager_load! 
+1

cache_classes rất bất tiện khi phát triển. Tôi sẽ thử phương thức eaglar_load! cảm ơn! – janechii

0

Trong mô hình khái niệm MVC không có ý định hành động một mình, tức là chúng chỉ hoạt động khi bộ điều khiển gửi cho chúng một thông báo (ví dụ: @ foo.register_acl). Các trường hợp mô hình thậm chí không nên tồn tại cho đến khi chúng được tạo ra bởi bộ điều khiển.

Bạn đang cố gắng đạt được gì với phương pháp register_acl của mình?

Nếu bạn thực sự cần một cái gì đó để được thực thi khi tạo đối tượng, bạn có thể sử dụng phương thức initialize() được gọi bất cứ khi nào một đối tượng Ruby được tạo.

Tuy nhiên, nếu bạn cần mô hình để thực thi một số mã, bạn có nhiều khả năng sẽ gặp phải một số lỗi mã và bạn cần thay đổi thứ gì đó trong ứng dụng của mình.

+0

Cảm ơn câu trả lời! Tôi đã cập nhật câu hỏi của mình để cho bạn biết tôi đang cố gắng làm gì. Tôi không cố gắng tạo/nhận các phiên bản của mô hình. Tôi chỉ cần các tập tin mô hình được nạp và đánh giá bởi Rails lúc khởi động. Trong một chương trình ruby ​​thông thường, bạn có thể mong đợi rằng mã lớp được đánh giá khi khởi động. Cảm ơn! – janechii

6

Tôi không biết nếu điều này là lý tưởng, nhưng nó hoạt động cho tôi. Một nơi nào đó trong config/khởi tạo /, tôi làm điều này:

Dir.glob("#{Rails.root}/app/models/*.rb").sort.each { |file| require_dependency file } 

và tải trước mô hình của tôi

+0

Điều này sẽ không tải các mô hình lồng nhau hoặc các mô hình trong các công cụ gắn kết, ví dụ. Cách tiếp cận tốt hơn là gọi 'Rails.application.eager_load!', Như câu trả lời trước đó được đề xuất. – dzajic

+0

Cảm ơn bạn đã chỉ ra điều đó, @dzajic. Nó đã được mãi mãi, nhưng đó là khoảng thời gian câu trả lời được thay đổi để giải pháp tốt hơn! – janechii

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