Как настроить Ruby on Rails без базы данных?

102

Было бы удобно использовать Ruby on Rails для небольшого проекта веб-сайта, который в настоящее время не нуждается в базе данных. Я знаю, что могу создать пустую базу данных в MySQL и перейти оттуда, но знает ли кто-нибудь лучший способ запустить Rails без базы данных?

Спасибо

РоббиКанак
источник

Ответы:

55

Раскомментируйте эту строку в environment.rbфайле:

config.frameworks -= [ :active_record, :active_resource, :action_mailer]
несоответствие типов
источник
2
в rails 3 просто удалите гем mysql из Gemfile
jspooner
31
Как бы вы сделали то же самое в Rails 4?
Daniel Ristic
2
Вопрос для Rails 4 stackoverflow.com/questions/19078044/…
grumpasaurus 08
109

Для Rails 3 и Rails 4 :

Используйте -O(Заглавную 'O') или --skip-activerecordопцию для создания приложения без базы данных.

rails new myApp -O

или

rails new myApp --skip-activerecord

Этот ответ опубликован здесь у себя


Для Rails 5 :

Используйте --skip-active-recordопцию для создания приложения без базы данных

Обратите внимание на дополнительный дефис '-' в отличие от предыдущих версий Rails .

rails new myApp --skip-active-record

RSK
источник
2
да, это работает с Rails 4 :) - только что подтверждено. Если вы хотите отказаться от использования тестового модуля: rails new myApp-O --skip-bundle -T
Крис Хаф
1
Это определенно самый простой способ, если вы начинаете с нуля, хотя имейте в виду, что (по крайней мере, в Rails 4.0.1) в этой команде есть знак «-» между активным и записанным. Поэтому следует читать: rails new myApp --skip-active-record
Ник Бендерс
1
Я просто столкнулся с проблемами и заметил. -OРаботает только для Rails 4.2.x. Вариант --skip-activerecordне работает.
Назар Хуссейн,
Это работает и в rails-api: rails new myApp -O. Спасибо
Абель
2
Если кому-то интересно, в Rails 5 это --skip-active-record(обратите внимание на черту между активной и записью). Другой способ у меня не работает.
audiodude
53

Для существующего проекта Rails 4/5/6 в вашем config/application.rbфайле есть следующая строка:

require 'rails/all' # or `require "rails"' in newer versions

(В качестве справки, эта строка загружает этот файл )
Таким образом, вместо загрузки ВСЕ, вы должны загружать каждую библиотеку отдельно следующим образом:

# active_record is what we're not going to use it, so comment it "just in case"
# require "active_record/railtie" 

# This is not loaded in rails/all but inside active_record so add it if
# you want your models work as expected
require "active_model/railtie" 
# And now the rest
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "active_job/railtie" # Only for Rails >= 4.2
require "action_cable/engine" # Only for Rails >= 5.0
require "sprockets/railtie"
require "rails/test_unit/railtie"

# All these depend on active_record, so they should be excluded also
# require "action_text/engine" # Only for Rails >= 6.0
# require "action_mailbox/engine" # Only for Rails >= 6.0
# require "active_storage/engine" # Only for Rails >= 5.2

Следите за комментариями, чтобы узнать, что загружать в отношении вашей версии Rails.
Также проверьте следующие файлы (если они у вас есть) и прокомментируйте следующие строки:

# package.json
"@rails/activestorage": "^6.0.0",

# app/javascript/packs/application.js
require("@rails/activestorage").start()

# bin/setup
system! 'bin/rails db:prepare'

# config/environments/development.rb
config.active_storage.service = :local # For Rails >= 5.2
config.active_record.migration_error = :page_load
config.active_record.verbose_query_logs = true

# config/environments/test.rb
config.active_storage.service = :test # For Rails >= 5.2

# config/environments/production.rb
config.active_storage.service = :local # For Rails >= 5.2
config.active_record.dump_schema_after_migration = false

# spec/rails_helper.rb
ActiveRecord::Migration.maintain_test_schema!

# test/test_helper.rb
fixtures :all # In case you're using fixtures

# Only for Rails >= 5.0
#config/initializers/new_framework_defaults.rb
Rails.application.config.active_record.belongs_to_required_by_default = true

Также удалите все ссылки на ActiveRecord::Baseфайлы вашей модели (или просто удалите файлы, если применимо). Например, автоматически сгенерированный app/models/application_record.rbфайл.

Alter Lagos
источник
2
Для Rails 5 вы также можете потребовать active_job/railtieиaction_cable/engine
Ingmaras Keleras 06
2
Разве не существует фиктивного адаптера БД, database.ymlчтобы он просто игнорировал БД?
Хлоя
Rails 5 приводит к проблеме сбоя rake assets:precompileиз-за NoMethodError: undefined method active_record '': /
flp
3
@Chloe Источник activerecord-nulldb-adapterиз github.com/nulldb/nulldb позволяет вам заменить адаптер для временного или менее инвазивного изменения.
Unixmonkey 01
1
@cdmo привет, спасибо, что заметили. Я обновил ответ, чтобы сделать его полностью совместимым с rails 6. Не уверен во всем, что вы прокомментировали в своем ответе, поскольку я создаю 2 приложения rails с и без -Oи action_mailerне связанных с ними config/detabase.yml, поэтому нет необходимости комментировать его. Также есть несколько дополнительных строк для комментариев после active_storageкомментирования.
Alter Lagos
16

В Rails 4 при запуске нового проекта вы можете использовать -O или --skip-active-record

rails new my_project -O
rails new my_project --skip-active-record

Если вы уже создали проект, вам нужно будет прокомментировать

 require "active_record/railtie"

из config / application.rb и

 config.active_record.migration_error = :page_load

из config / environment / development.rb

Джон Барела
источник
14

Если вам не нужна база данных, вам, вероятно, не понадобится большая часть Rails. Вы можете захотеть работать с более настраиваемой структурой меньшего размера.

Sinatra - это крошечный фреймворк, который отлично подходит для обслуживания базовых статических страниц.

Но если вы настаиваете на использовании Rails здесь есть статья , которая покажет вам , как сделать это или здесь .

vrish88
источник
Спасибо - обе эти ссылки относятся к книге рецептов Rails и содержат шаги по тестированию, работающему с приложением rails без базы данных. Я был ленив и надеялся использовать уже имеющуюся на сервере инфраструктуру rails для других приложений, но Sintatra выглядит интригующим.
RobbieCanuck
1
Я не согласен. Active.com построен на Rails без базы данных, потому что все данные поступают из api.
jspooner
Примечание: второй ссылки в последнем предложении больше не существует. Я получаю ошибку 404: не найден.
Памела Кук - LightBe Corp
0

Для поддержки Rails 6 rc1 и activerecord-nulldb-adaptergem нам нужен патч обезьяны

В config / initializers / null_db_adapter_monkey_patches.rb

module ActiveRecord
  module ConnectionAdapters
    class NullDBAdapter < ActiveRecord::ConnectionAdapters::AbstractAdapter
      def new_table_definition(table_name = nil, is_temporary = nil)
        TableDefinition.new(table_name, is_temporary)
      end
    end
  end
end
С.Чуб
источник