Удалите ActiveRecord в Rails 3

99

Теперь, когда бета-версия Rails 3 вышла, я подумал, что смогу переписать приложение, над которым я только что начал работать, в бета-версии Rails 3, чтобы прочувствовать это и получить некоторую фору. Приложение использует MongoDB и MongoMapper для всех своих моделей и поэтому не нуждается в ActiveRecord. В предыдущей версии я выгружал 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 для другого (временного) приложения с этой опцией, и она сгенерировала новый шаблон приложения, точно соответствующий тому, что вы написали выше. Поэтому я мог просто скопировать и вставить эти изменения в свое настоящее приложение. Спасибо - хорошая находка :)
Марк Эмблинг
1
Отлично - спасибо за --skip-activerecord. Это как раз то, что мне было нужно.
Finglas
Это работает по большей части, за исключением случаев, когда я запускаю rails generate - я все еще вижу там ActiveRecord - как мне его удалить?
Hackeron
8
В rails 3.1 вам также необходимо иметь require "sprockets/railtie"в своем application.rbфайле.
erskingardner
1
Просто чтобы добавить быстрое обновление к этому ответу и моему предыдущему комментарию ... в Rails 3.1 это сейчас --skip-active-record. Обратите внимание на лишнее тире.
Марк Эмблинг
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"
    требуются "звездочки / рельс"
    требуется "rails / 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 08
Мне помогли, спасибо! Согласно комментариям ниже, в файлах application.rb и / или environment / {env} .rb могут быть другие декларации конфигурации, которые нужно закомментировать. YMMV.
Натан Смит
активная запись по-прежнему остается в gemfile.lock ... Можем ли мы что-то сделать против этого?
Boti
@Boti Вряд ли. Это часть рельсов. Чтобы удалить его из вашего .lock, я полагаю, вам придется удалить зависимость от рельсов и зависеть от всех отдельных компонентов. Ознакомьтесь с gemspec для получения списка зависимостей - вы хотите зависеть от всего, кроме activerecord. github.com/rails/rails/blob/master/rails.gemspec
Джон Хиннеган
Похоже, после внесения этого изменения я столкнулся с проблемой, связанной с i18n: lib / active_support / i18n.rb: 13: in `<top (required)> ': неинициализированная константа I18n (NameError). Любые идеи?
Майкл Пелл
36

Для нового приложения rails вы можете исключить активную запись, указав параметр --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

Все вышесказанное верно. Еще одна вещь, которую мне пришлось сделать в rails 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)

Эндрю Ланк
источник