Usuń ActiveRecord w Railsach 3

99

Teraz, gdy beta Rails 3 jest już dostępna, pomyślałem, że przyjrzę się przepisaniu aplikacji, nad którą właśnie zacząłem pracować, w wersji beta Rails 3, zarówno po to, aby ją poczuć i uzyskać trochę przewagi. Aplikacja korzysta z MongoDB i MongoMapper dla wszystkich swoich modeli i dlatego nie ma potrzeby korzystania z ActiveRecord. W poprzedniej wersji wyładowuję activerecord w następujący sposób:

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

W najnowszej wersji to nie działa - po prostu wyrzuca błąd:

/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*

Oczywiście spojrzałem na boot.rb tak, jak sugerował, ale z tego co widzę, nie ma tu żadnej wskazówki, jak mogę zabrać się do wyładowania AR. Powodem, dla którego muszę to zrobić, jest to, że nie tylko głupie jest ładowanie czegoś, czego nie chcę, ale narzeka na niemożność nawiązania połączenia DB, nawet gdy próbuję uruchomić generator dla kontrolera. Dzieje się tak, ponieważ wyczyściłem database.ymli zastąpiłem go szczegółami połączenia dla MongoDB, aby wykorzystać tę istotę do korzystania z database.yml dla szczegółów połączenia MongoDB. Nie jestem pewien, dlaczego w ogóle musi być w stanie zainicjować połączenie DB, aby i tak wygenerować kontroler ...

Czy ktoś wie, jak to zrobić w Railsach 3?

Mark Embling
źródło

Odpowiedzi:

155

Przechodzę przez to od czytania źródła, więc daj mi znać, czy faktycznie zadziałało. :)

railsPoleceń, które generuje szablon aplikacji ma teraz opcję -O, która informuje go pominąć ActiveRecord.

Jeśli nie masz ochoty uruchamiać ponownie rails, sprawdź następujące elementy w istniejącej aplikacji:

  • Sprawdź, config/application.rb czy nie masz require 'rails/all'lub require "active_record/railtie". Zamiast tego, dla standardowej konfiguracji Railsów bez ActiveRecord, powinna mieć tylko następujące wymagania:

    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
  • Jeśli w programie config/application.rbużywasz config.generatorssekcji, upewnij się, że nie zawiera ona linii g.orm :active_record. Jeśli chcesz, możesz ustawić to jawnie na nil, ale powinno to być ustawienie domyślne, gdy g.ormjest całkowicie pominięte.

  • Opcjonalnie, ale w swoim Gemfile, usuń gemwiersz, który ładuje moduł dla twojej bazy danych. Może to być gem "mysql"na przykład linia .

Stéphan Kochen
źródło
3
Tak, wydaje się, że to się udało. Wygląda na to, że opcję -O można również wywołać jako „--skip-activerecord”. Uruchomiłem polecenie rails dla innej (tymczasowej) aplikacji z tą opcją i wygenerowałem nowy szablon aplikacji pasujący dokładnie do tego, co napisałeś powyżej. Mogłem więc po prostu skopiować i wkleić te zmiany do mojej rzeczywistej aplikacji. Dzięki - miłe znalezisko :)
Mark Embling
1
Doskonale - dzięki za --skip-activerecord. Właśnie tego potrzebowałem.
Finglas
To działa w większości, z wyjątkiem sytuacji, gdy uruchamiam generowanie railsów - nadal widzę tam rzeczy z ActiveRecord - jak to usunąć?
Hackeron,
8
W railsach 3.1 musisz też mieć require "sprockets/railtie"w swoim application.rbpliku.
erskingardner
1
Aby dodać szybką aktualizację do tej odpowiedzi i mojego poprzedniego komentarza ... w Railsach 3.1, jest teraz --skip-active-record. Zwróć uwagę na dodatkową kreskę.
Mark Embling,
46

Szyny 4

Szukałem, jak to wyłączyć w szynach 4 i znalazłem tylko tę odpowiedź, która już nie działa na szynach 4. Tak więc można to zrobić na szynach 4 (testowane w RC1).

W nowym projekcie

rails new YourProject --skip-active-record

W istniejącym projekcie

  • W swoim Gemfile usuń klejnot sterownika bazy danych, np . gem 'sqlite3'Lub gem 'pg'.
  • W config / environment.rb, wymienić require 'rails/all'z

    wymagają „action_controller / railtie”
    wymagają „action_mailer / railtie”
    wymagają „kół zębatych / łącznika szyny”
    wymagają „rails / test_unit / railtie”
    

  • W config / environment / development.rb usuń lub zakomentuj config.active_record.migration_error = :page_load

  • Potencjalnie musisz usunąć pomocników active_record z spec_helper (przez VenoM w komentarzach)

  • Potencjalnie musisz usunąć oprogramowanie pośredniczące ConnectionManagement (wydaje się, że tak jest w przypadku jednorożca): config.app_middleware.delete "ActiveRecord::ConnectionAdapters::ConnectionManagement"(przez https://stackoverflow.com/a/18087332/764342 )

Mam nadzieję, że pomoże to innym szukającym sposobu wyłączenia ActiveRecord w Railsach 4.

apeiros
źródło
3
Dzięki! Nadal musisz usunąć pomocników active_record z spec_helper (nie jest to obowiązkowe, ale jeśli używasz specyfikacji). Zobacz ostatni komentarz Rimiana.
VenoM,
Pomogli mi, dzięki! Zgodnie z poniższymi komentarzami mogą istnieć inne deklaracje konfiguracji do skomentowania w plikach application.rb i / lub environment / {env} .rb. YMMV.
Nathan Smith
aktywny zapis nadal pozostaje w gemfile.lock ... Czy możemy coś z tym zrobić?
Boti
@Boti mało prawdopodobne. To część szyn. Aby usunąć to z twojego .lock Wyobrażam sobie, że musiałbyś usunąć zależność od szyn i polegać na wszystkich poszczególnych komponentach. Sprawdź gemspec, aby zapoznać się z listą zależności - chciałbyś polegać na wszystkim oprócz aktywnego rekordu. github.com/rails/rails/blob/master/rails.gemspec
John Hinnegan
Po wprowadzeniu tej zmiany wydaje mi się, że mam problem związany z i18n: lib / active_support / i18n.rb: 13: in `<top (wymagane)> ': niezainicjalizowana stała I18n (NameError). Jakieś pomysły?
Michael Pell,
36

W przypadku nowej aplikacji railsowej można ją wykluczyć aktywny rekord, określając parametr --skip-active-record. Na przykład:

rails new appname --skip-active-record
Jim Geurts
źródło
Zrobiłem to i uruchomiłem kilka różnic, aby znaleźć i usunąć rzeczy w mojej obecnej aplikacji, która korzystała z ActiveRecord
Keith Smiley
15

Jeśli wygenerowałeś nowy projekt przy użyciu Rails 3.2, będziesz musiał również skomentować:

config.active_record.mass_assignment_sanitizer = :strict

i

config.active_record.auto_explain_threshold_in_seconds = 0.5

w pliku development.rb .

vlad
źródło
6

Wszystko powyżej jest prawdą. Jeszcze jedna rzecz, którą musiałem zrobić w szynach 3.1 to skomentowanie

config.active_record.identity_map = true

w config/application.rb.

Michał Kuklis
źródło
2

Jeśli używasz rspec, musisz również usunąć (w spec_helper):

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

i usuń

  # 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
źródło
1

Również skomentować out

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

(zapisane na szynach 3.2.13)

Andrew Lank
źródło