Pertanyaan Rel 3 memuat semua model saat startup


Saya memiliki metode kelas yang tercampur dengan semua model saya. metode dipanggil ketika kelas model dievaluasi. sayangnya (bagi saya), ini tampaknya sesuai permintaan, kapan pun model diperlukan dalam env pengembangan. bagaimana bisa memuat rel semua model saat start up? apakah ini bahkan dianjurkan?

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

Pada dasarnya, register_acl mengambil beberapa argumen "tindakan" yang modelnya ingin dikontrol aksesnya. Misalkan salah satu tindakan Foo adalah "mengelola" dan sistem perlu menyadari tindakan ini saat mulai. Saya pikir dalam model adalah tempat paling alami untuk memiliki logika ini.

Terima kasih!


12
2018-06-12 03:05


asal


Jawaban:


Cara yang benar untuk melakukan aplikasi ini adalah untuk mengaktifkan cache_classes dalam konfigurasi Anda. Secara default itu dalam pengembangan tetapi di dalam produksi.

Jika Anda ingin melakukannya secara sporadis:

Rails.application.eager_load!

18
2018-05-23 02:54



Saya tidak tahu apakah ini ideal, tetapi bekerja untuk saya. Di suatu tempat di config / inisialisasi /, saya melakukan ini:

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

dan yang mem-pramuat model saya


6
2018-01-21 22:04



Dalam model konsep MVC tidak dimaksudkan untuk bertindak sendiri, yaitu mereka hanya bertindak ketika pengontrol mengirim pesan kepada mereka (misalnya, @ foo.register_acl). Contoh model bahkan tidak boleh ada hingga dibuat oleh pengontrol.

Apa yang Anda coba capai dengan metode register_acl Anda?

Jika Anda benar-benar membutuhkan sesuatu untuk dieksekusi pada pembuatan objek, Anda dapat menggunakan metode inisialisasi () yang dipanggil setiap kali sebuah objek Ruby dibuat.

Namun jika Anda perlu model untuk mengeksekusi beberapa kode dengan sendirinya Anda kemungkinan besar menghadapi beberapa kode bau dan Anda perlu mengubah sesuatu di dalam aplikasi Anda.


0
2018-06-12 06:48