Hapus ActiveRecord di Rails 3

99

Sekarang Rails 3 beta sudah keluar, saya pikir saya akan melihat menulis ulang aplikasi yang baru saja saya mulai bekerja di Rails 3 beta, keduanya untuk merasakannya dan sedikit memulai. Aplikasi ini menggunakan MongoDB dan MongoMapper untuk semua modelnya dan oleh karena itu tidak memerlukan ActiveRecord. Di versi sebelumnya, saya membongkar activerecord dengan cara berikut:

config.frameworks -= [ :active_record ]    # inside environment.rb

Di versi terbaru ini tidak berfungsi - ini hanya melontarkan kesalahan:

/Library/Ruby/Gems/1.8/gems/railties-3.0.0.beta/lib/rails/configuration.rb:126:in
  `frameworks': config.frameworks in no longer supported. See the generated 
  config/boot.rb for steps on how to limit the frameworks that will be loaded 
  (RuntimeError)
 from *snip*

Tentu saja, saya telah melihat boot.rb seperti yang disarankan, tetapi sejauh yang saya lihat, tidak ada petunjuk di sini tentang bagaimana saya akan membongkar AR. Alasan saya perlu melakukan ini adalah karena tidak hanya konyol memuat sesuatu yang tidak saya inginkan, tetapi juga mengeluh tentang ketidakmampuannya untuk membuat koneksi DB bahkan ketika saya mencoba menjalankan generator untuk pengontrol. Ini karena saya telah menghapus database.ymldan menggantinya dengan detail koneksi untuk MongoDB agar dapat menggunakan inti ini untuk menggunakan database.yml untuk detail koneksi MongoDB. Tidak yakin mengapa harus dapat memulai koneksi DB sama sekali hanya untuk menghasilkan pengontrol ....

Adakah yang mengetahui cara Rails 3 yang benar untuk melakukan ini?

Tandai Embling
sumber

Jawaban:

155

Saya melihat ini dari membaca sumbernya, jadi beri tahu saya jika itu benar-benar berfungsi. :)

The railsperintah yang menghasilkan aplikasi template sekarang memiliki opsi -O, yang mengatakan itu untuk melewatkan ActiveRecord.

Jika Anda tidak ingin menjalankan ulang rails, Anda harus memeriksa hal-hal berikut di aplikasi Anda yang sudah ada:

  • Periksa apakah Anda config/application.rb tidak memiliki require 'rails/all'atau require "active_record/railtie". Sebagai gantinya, untuk penyiapan Rails standar tanpa ActiveRecord, itu hanya memerlukan persyaratan berikut:

    require File.expand_path('../boot', __FILE__)
    
    require "action_controller/railtie"
    require "action_mailer/railtie"
    require "active_resource/railtie"
    require "rails/test_unit/railtie"
    require "sprockets/railtie"
    
    # Auto-require default libraries and those for the current Rails environment. 
    Bundler.require :default, Rails.env
  • Jika, di config/application.rb, Anda menggunakan config.generatorsbagian tersebut, pastikan tidak ada garisnya g.orm :active_record. Anda dapat menyetel ini secara eksplisit ke nil, jika Anda mau, tetapi ini harus menjadi default saat g.ormbenar-benar dihilangkan.

  • Opsional, tetapi di Anda Gemfile, hapus gembaris yang memuat modul untuk database Anda. Ini bisa menjadi garis gem "mysql"misalnya.

Stéphan Kochen
sumber
3
Yup, sepertinya berhasil. Tampaknya opsi -O juga dapat dipanggil sebagai '--skip-activerecord'. Saya menjalankan perintah rails untuk aplikasi (sementara) lain dengan opsi ini dan itu menghasilkan template aplikasi baru yang sama persis dengan yang Anda tulis di atas. Jadi saya bisa menyalin dan menempelkan perubahan ini ke aplikasi saya yang sebenarnya. Terima kasih -
temuan
1
Luar biasa - terima kasih atas --skip-activerecord. Itulah yang saya butuhkan.
Finglas
Itu berfungsi untuk sebagian besar, kecuali ketika saya menjalankan rails generate - Saya masih melihat hal-hal ActiveRecord di sana - bagaimana cara menghapusnya?
Hackeron
8
Di rails 3.1 Anda juga harus memiliki file require "sprockets/railtie"Anda application.rb.
erskingardner
1
Hanya untuk menambahkan pembaruan cepat ke jawaban ini dan komentar saya sebelumnya ... di Rails 3.1, sekarang --skip-active-record. Perhatikan tanda hubung ekstra.
Mark Embling
46

Rel 4

Saya sedang mencari cara menonaktifkannya di rel 4 dan hanya menemukan jawaban ini yang tidak lagi berfungsi di rel 4. Jadi, inilah cara Anda melakukannya di rel 4 (diuji di RC1).

Dalam proyek baru

rails new YourProject --skip-active-record

Dalam proyek yang sudah ada

  • Di Gemfile Anda, hapus gem driver database, misalnya gem 'sqlite3'atau gem 'pg'.
  • Di config / application.rb, ganti require 'rails/all'dengan

    memerlukan "action_controller / railtie"
    memerlukan "action_mailer / railtie"
    membutuhkan "sprocket / railtie"
    membutuhkan "rails / test_unit / railtie"
    

  • Di config / environment / development.rb, hapus atau beri komentar config.active_record.migration_error = :page_load

  • Kemungkinan Anda harus menghapus pembantu active_record dari spec_helper (melalui VenoM di komentar)

  • Kemungkinan Anda harus menghapus middleware ConnectionManagement (tampaknya terjadi pada unicorn): config.app_middleware.delete "ActiveRecord::ConnectionAdapters::ConnectionManagement"(melalui https://stackoverflow.com/a/18087332/764342 )

Saya harap ini membantu orang lain yang mencari cara menonaktifkan ActiveRecord di Rails 4.

apeiros
sumber
3
Terima kasih! Anda tetap perlu menghapus pembantu active_record dari spec_helper (Tidak wajib, tetapi jika Anda menjalankan spesifikasi). Lihat komentar terakhir oleh Rimian.
VenoM
Membantu saya, terima kasih! Berdasarkan komentar di bawah, mungkin ada deklarasi konfigurasi lain untuk dikomentari dalam file application.rb dan / atau environment / {env} .rb. YMMV.
Nathan Smith
activerecord masih ada di gemfile.lock ... Bisakah kita melakukan sesuatu untuk melawannya?
Boti
@Boti tidak mungkin. Itu bagian dari rel. Untuk menghapusnya dari .lock Anda, saya membayangkan Anda harus menghapus ketergantungan pada rel dan bergantung pada semua komponen individu. Lihat gemspec untuk daftar dependensi - Anda ingin bergantung pada semuanya kecuali activerecord. github.com/rails/rails/blob/master/rails.gemspec
John Hinnegan
Sepertinya saya mengalami masalah terkait i18n setelah melakukan perubahan ini: lib / active_support / i18n.rb: 13: di `<top (diperlukan)> ': I18n konstan yang tidak diinisialisasi (NameError). Ada ide?
Michael Pell
36

Untuk aplikasi rails baru, Anda dapat membuatnya mengecualikan rekaman aktif dengan menentukan parameter --skip-active-record. Misalnya:

rails new appname --skip-active-record
Jim Geurts
sumber
Saya melakukan ini dan menjalankan beberapa perbedaan untuk menemukan dan menghapus hal-hal di aplikasi saya saat ini yang menggunakan ActiveRecord
Keith Smiley
15

Jika Anda membuat proyek baru menggunakan Rails 3.2, Anda juga perlu berkomentar:

config.active_record.mass_assignment_sanitizer = :strict

dan

config.active_record.auto_explain_threshold_in_seconds = 0.5

di file development.rb Anda .

vlad
sumber
6

Semua hal di atas benar. Satu hal lagi yang harus saya lakukan di rel 3.1 adalah memberi komentar

config.active_record.identity_map = true

masuk config/application.rb.

Michal Kuklis
sumber
2

Jika Anda menjalankan rspec, Anda juga perlu menghapus (di spec_helper):

  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

dan hapus

  # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = true
Rimian
sumber
1

Juga komentar keluar

# config/application.rb    
config.active_record.whitelist_attributes = true

(dicatat di rel 3.2.13)

Andrew Lank
sumber