Видаліть ActiveRecord в Rails 3


99

Тепер, коли бета-версія Rails 3 вийшла, я подумав, що перегляну перезапис програми, над якою я нещодавно розпочав роботу над бета-версією Rails 3, як щоб відчути це і трохи почати. Додаток використовує MongoDB та MongoMapper для всіх своїх моделей, тому не має потреби в ActiveRecord. У попередній версії я вивантажую активний запис таким чином:

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

В останній версії це не працює - воно просто видає помилку:

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

Звичайно, я дивився на boot.rb, як було запропоновано, але, наскільки я бачу, тут немає жодної підказки щодо того, як би я міг піти на розвантаження AR. Причина, що мені потрібно зробити це, полягає в тому, що не тільки нерозумно завантажувати те, що я не хочу, але і скаржиться на свою нездатність встановити з'єднання БД, навіть коли я намагаюся запустити генератор для контролера. Це тому, що я витер database.ymlі замінив його деталями з'єднання для MongoDB, щоб використати цю суть для використання database.yml для деталей MongoDB. Не впевнений, чому йому взагалі потрібно бути в змозі ініціювати з'єднання з БД просто для створення контролера ....

Хтось знає про правильний спосіб Rails 3?

Відповіді:


155

Я переходжу до цього, читаючи джерело, тому повідомте мені, чи справді це спрацювало. :)

railsКоманда , яка генерує шаблон додатки тепер має опцію -O, яка говорить , що пропустити ActiveRecord.

Якщо ви не відчуваєте натомість переспіви rails, слід перевірити наступне у наявному додатку:

  • Переконайтеся , що ваш config/application.rb НЕ має require 'rails/all'або require "active_record/railtie". Натомість, для стандартної установки Rails без ActiveRecord, вона повинна мати лише наступне:

    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
  • Якщо config/application.rbви використовуєте config.generatorsрозділ, переконайтеся, що в ньому немає рядка g.orm :active_record. Ви можете встановити це явно nil, якщо хочете, але це має бути за замовчуванням, коли g.ormповністю пропущено.

  • Необов’язково, але у вашому випадку Gemfileвидаліть gemрядок, що завантажує модуль для вашої бази даних. gem "mysql"Наприклад, це може бути рядок .


3
Так, здається, це вдалося зробити. Здається, опцію -O також можна викликати як "--skip-activerecord". Я запустив команду rails для іншого (тимчасового) додатка з цією опцією, і він створив новий шаблон додатка, що точно відповідає тому, що ви написали вище. Тож я міг просто скопіювати та вставити ці зміни у свій фактичний додаток. Спасибі - приємна знахідка :)
Марк Embling

1
Відмінно - дякую за --skip-activerecord. Це саме те, що мені було потрібно.
Finglas

Це працює здебільшого, за винятком випадків, коли я запускаю рейки - я все ще бачу там дані ActiveRecord - як я її видалити?
Хекрон

8
У рейках 3.1 вам також потрібно мати require "sprockets/railtie"свій application.rbфайл.
erskingardner

1
Просто додати швидке оновлення до цієї відповіді та мого попереднього коментаря ... в Rails 3.1, це зараз --skip-active-record. Помітьте додатковий тире.
Марк Embling

46

Рейки 4

Я шукав, як відключити його в рейках 4, і лише знайшов цю відповідь, яка більше не працює в рейках 4. Отже, це можна зробити в рейках 4 (перевірено в RC1).

У новому проекті

rails new YourProject --skip-active-record

У існуючому проекті

  • У своєму Gemfile видаліть драйвер драйвера бази даних, наприклад, gem 'sqlite3'або gem 'pg'.
  • У config / application.rb замініть require 'rails/all'на

    вимагають "action_controller / railtie"
    вимагати "action_mailer / railtie"
    вимагають "зірочки / рейки"
    вимагають "рейки / test_unit / railtie"
    

  • У config / environment / development.rb видаліть або коментуйте config.active_record.migration_error = :page_load

  • Потенційно вам потрібно видалити помічники active_record з spec_helper (через VenoM в коментарях)

  • Потенційно вам потрібно видалити проміжне програмне забезпечення ConnectionManagement (схоже, це стосується єдинорога): config.app_middleware.delete "ActiveRecord::ConnectionAdapters::ConnectionManagement"(через https://stackoverflow.com/a/18087332/764342 )

Я сподіваюся, що це допомагає іншим шукати, як відключити ActiveRecord в Rails 4.


3
Дякую! Все-таки потрібно видалити помічники active_record з spec_helper (Не обов’язково, але якщо у вас запущені характеристики). Дивіться останній коментар Ріміана.
VenoM

Допомогли мені, дякую! Відповідно до наведених нижче коментарів, можуть бути інші конфігураційні декларації для коментарів у файлах application.rb та / або середовищах / {env} .rb. YMMV.
Натан Сміт

активний запис все ще залишається в gemfile.lock ... Чи можемо ми зробити щось проти цього?
Боті

@Boti Навряд чи. Це частина рейок. Щоб видалити його зі свого .lock, я думаю, вам доведеться зняти залежність від рейок і залежати від усіх окремих компонентів. Перегляньте gemspec для списку залежностей - ви хочете залежати від усього, крім активного запису. github.com/rails/rails/blob/master/rails.gemspec
Джон Хіннеган

Здається, я зіткнувся з проблемою, пов’язаною з i18n, після внесення цих змін: lib / active_support / i18n.rb: 13: у `<top (обов'язково)> ': неініціалізована константа I18n (NameError). Якісь ідеї?
Майкл Пелл

36

У новому додатку рейки ви можете виключати активний запис, вказуючи параметр --skip-active-record. Наприклад:

rails new appname --skip-active-record

Я зробив це і провів кілька розбіжностей, щоб знайти та видалити речі в моєму теперішньому додатку, який використовував ActiveRecord
Кіт Смілі

15

Якщо ви створили новий проект за допомогою Rails 3.2, вам також потрібно буде прокоментувати:

config.active_record.mass_assignment_sanitizer = :strict

і

config.active_record.auto_explain_threshold_in_seconds = 0.5

у вашому файлі development.rb


6

Все вищезазначене вірно. Ще одне, що мені довелося зробити в рейках 3.1 - це прокоментувати

config.active_record.identity_map = true

в config/application.rb.


2

Якщо ви працюєте з rspec, вам також потрібно видалити (у spec_helper):

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

і видалити

  # 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

1

Також коментар з

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

(відмічено на рейках 3.2.13)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.