Saya telah melakukan beberapa bacaan tentang cara memperluas ActiveRecord: Kelas dasar sehingga model saya akan memiliki beberapa metode khusus. Apa cara mudah untuk memperpanjangnya (tutorial langkah demi langkah)?
ruby-on-rails
extend
rails-activerecord
xpepermint
sumber
sumber
Jawaban:
Ada beberapa pendekatan:
Menggunakan ActiveSupport :: Concern (Lebih disukai)
Baca dokumentasi ActiveSupport :: Concern untuk lebih jelasnya.
Buat file yang disebut
active_record_extension.rb
dilib
direktori.Buat file di
config/initializers
direktori bernamaextensions.rb
dan tambahkan baris berikut ke file:Warisan (Diutamakan)
Lihat jawaban Toby .
Penambalan monyet (Harus dihindari)
Buat file di
config/initializers
direktori yang disebutactive_record_monkey_patch.rb
.Kutipan terkenal tentang ekspresi Reguler oleh Jamie Zawinski dapat bertujuan kembali untuk mengilustrasikan masalah yang terkait dengan patch-monyet.
Penambalan monyet mudah dan cepat. Tetapi, waktu dan upaya yang dihemat selalu diambil kembali di masa depan; dengan bunga majemuk. Hari ini saya membatasi patch monyet untuk dengan cepat membuat prototipe solusi di konsol rel.
sumber
require
file di akhirenvironment.rb
. Saya telah menambahkan langkah ekstra ini untuk jawaban saya.ImprovedActiveRecord
dan mewarisinya, saat Anda menggunakanmodule
, Anda memperbarui definisi kelas yang dimaksud. Saya dulu menggunakan warisan (karena pengalaman Java / C ++ bertahun-tahun). Saat ini saya lebih banyak menggunakan modul.Refinements
yang mengatasi sebagian besar masalah dengan patch monyet ( yehudakatz.com/2010/11/30/ruby-2-0-refinements-in-practice ). Terkadang ada fitur yang hanya memaksa Anda untuk menggoda nasib. Dan terkadang Anda melakukannya.Anda bisa memperpanjang kelas dan cukup menggunakan warisan.
sumber
abstract_models
. Di mana saya harus meletakkannya?self.abstract_class = true
keAbstractModel
. Rails sekarang akan mengenali model tersebut sebagai model abstrak.AbstractModel
di database. Siapa yang tahu penyetel sederhana akan membantu saya KERING! (Saya mulai merasa ngeri ... itu buruk). Terima kasih Toby dan Harish!Anda juga dapat menggunakan
ActiveSupport::Concern
dan menjadi lebih idiom inti Rails seperti:[Sunting] mengikuti komentar dari @daniel
Maka semua model Anda akan
foo
memasukkan metode sebagai metode instance dan metode yangClassMethods
dimasukkan sebagai metode kelas. Misalnya padaFooBar < ActiveRecord::Base
Anda akan memiliki:FooBar.bar
danFooBar#foo
http://api.rubyonrails.org/classes/ActiveSupport/Concern.html
sumber
InstanceMethods
sudah usang sejak Rails 3.2, cukup masukkan metode Anda ke dalam modul body.ActiveRecord::Base.send(:include, MyExtension)
inisialisasi dan kemudian ini bekerja untuk saya. Rails 4.1.9Dengan Rails 4, konsep menggunakan kekhawatiran untuk memodulasi dan KERING model Anda telah menjadi sorotan.
Kekhawatiran pada dasarnya memungkinkan Anda untuk mengelompokkan kode yang serupa dari suatu model atau melintasi beberapa model dalam satu modul dan kemudian menggunakan modul ini dalam model. Berikut ini sebuah contoh:
Pertimbangkan model Artikel, model Acara dan Model Komentar. Artikel atau acara memiliki banyak komentar. Komentar adalah milik artikel atau acara.
Secara tradisional, modelnya mungkin terlihat seperti ini:
Model komentar:
Model artikel:
Model Peristiwa
Seperti yang dapat kita perhatikan, ada potongan kode penting yang umum untuk Peristiwa dan Model Artikel. Dengan menggunakan kekhawatiran, kami dapat mengekstrak kode umum ini dalam modul yang terpisah, Commentable.
Untuk ini, buat file commentable.rb di app / model / concern.
Dan sekarang model Anda terlihat seperti ini:
Model komentar:
Model artikel:
Model Peristiwa
Satu hal yang saya ingin soroti saat menggunakan Kekhawatiran adalah bahwa Kekhawatiran harus digunakan untuk pengelompokan 'berbasis domain' daripada pengelompokan 'teknis'. Misalnya, pengelompokan domain seperti 'Commentable', 'Taggable' dll. Pengelompokan berbasis teknis akan seperti 'FinderMethods', 'ValidationMethods'.
Berikut ini tautan ke pos yang menurut saya sangat berguna untuk memahami masalah dalam Model.
Semoga Langgan membantu :)
sumber
Langkah 1
Langkah 2
Langkah 3
sumber
Rails 5 menyediakan mekanisme bawaan untuk memperpanjang
ActiveRecord::Base
.Ini dicapai dengan memberikan lapisan tambahan:
dan semua model mewarisi dari yang itu:
Lihat misalnya blogpost ini .
sumber
Hanya untuk menambah topik ini, saya menghabiskan waktu mencari cara untuk menguji ekstensi tersebut (saya pergi jalan
ActiveSupport::Concern
.)Inilah cara saya menyiapkan model untuk menguji ekstensi saya.
sumber
Dengan Rails 5, semua model diwarisi dari ApplicationRecord & ini memberikan cara yang bagus untuk memasukkan atau memperluas perpustakaan ekstensi lainnya.
Misalkan modul metode khusus harus tersedia di semua model, sertakan dalam file application_record.rb. Jika kami ingin menerapkan ini untuk serangkaian model tertentu, maka sertakan dalam kelas model masing-masing.
Jika Anda ingin agar metode yang didefinisikan dalam modul sebagai metode kelas, perluas modul ke ApplicationRecord.
Semoga ini bisa membantu orang lain!
sumber
saya sudah
dalam penginisialisasi
Untuk modul seperti di bawah ini
sumber