Ruby
ActiveRecord
RubyOnRails
Rails5

rails newで--skip-active-recordをつけ[た|なかった]時の違い

Mongo 6.3の公式ドキュメントには以下のように書かれています。

If you are creating a new Rails application, you’ll have to use the --skip-active-record flag with rails new.

rails newの時に--skip-active-recordを付け忘れた場合でも、どこに差異があるかを把握していれば後からでも直せるじゃん!ってことで一度実験したのでメモ的な意味で記事にしました。

この記事中でのバージョンなど

  • Ruby 2.4.1
  • Rails 5.1.4

diffるためのrailsアプリケーションを作る

  1. rails newするためのrailsを用意

    $ mkdir -p rails_app_1/sample_app
    $ cd rails_app_1/sample_app
    $ cat <<EOS >Gemfile
    source 'http://rubygems.org'
    gem 'rails'
    EOS
    $ bundle install --path tmp/bundle
    
  2. ここで複製

    $ cd ../../
    $ cp -r rails_app_1 rails_app_2
    
  3. それぞれrails newする

    $ cd rails_app_1/sample_app
    $ bundle exec rails new . --skip-bundle --force
    $ cd ../../rails_app_2/sample_app
    $ bundle exec rails new . --skip-bundle --skip-active-record --force
    

    --forceオプションは1.で作ったGemfileを上書きするためです。

diffる

$ diff -uprN rails_app_1/sample_app rails_app_2/sample_app > diff.patch

Gist: diff.patch

.gitignore

  • /db/以下を削除

    diff -uprN rails_app_1/sample_app/.gitignore rails_app_2/sample_app/.gitignore
    --- rails_app_1/sample_app/.gitignore 2018-02-03 20:14:53.000000000 +0900
    +++ rails_app_2/sample_app/.gitignore 2018-02-03 20:16:18.000000000 +0900
    @@ -7,10 +7,6 @@
     # Ignore bundler config.
     /.bundle
    
    -# Ignore the default SQLite database.
    -/db/*.sqlite3
    -/db/*.sqlite3-journal
    -
     # Ignore all logfiles and tempfiles.
     /log/*
     /tmp/*
    

Gemfile

  • SQLite3を削除

    diff -uprN rails_app_1/sample_app/Gemfile rails_app_2/sample_app/Gemfile
    --- rails_app_1/sample_app/Gemfile  2018-02-03 20:14:53.000000000 +0900
    +++ rails_app_2/sample_app/Gemfile  2018-02-03 20:16:18.000000000 +0900
    @@ -8,8 +8,6 @@ end
    
     # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
     gem 'rails', '~> 5.1.4'
    -# Use sqlite3 as the database for Active Record
    -gem 'sqlite3'
     # Use Puma as the app server
     gem 'puma', '~> 3.7'
     # Use SCSS for stylesheets
    

app/models/application_record.rb

  • ファイルごと削除

    diff -uprN rails_app_1/sample_app/app/models/application_record.rb rails_app_2/sample_app/app/models/application_record.rb
    --- rails_app_1/sample_app/app/models/application_record.rb 2018-02-03 20:14:53.000000000 +0900
    +++ rails_app_2/sample_app/app/models/application_record.rb 1970-01-01 09:00:00.000000000 +0900
    @@ -1,3 +0,0 @@
    -class ApplicationRecord < ActiveRecord::Base
    -  self.abstract_class = true
    -end
    

bin/setup

  • rails db:setupの呼び出しを削除

    diff -uprN rails_app_1/sample_app/bin/setup rails_app_2/sample_app/bin/setup
    --- rails_app_1/sample_app/bin/setup  2018-02-03 20:14:53.000000000 +0900
    +++ rails_app_2/sample_app/bin/setup  2018-02-03 20:16:18.000000000 +0900
    @@ -22,14 +22,6 @@ chdir APP_ROOT do
       # system('bin/yarn')
    
    -  # puts "\n== Copying sample files =="
    -  # unless File.exist?('config/database.yml')
    -  #   cp 'config/database.yml.sample', 'config/database.yml'
    -  # end
    -
    -  puts "\n== Preparing database =="
    -  system! 'bin/rails db:setup'
    -
       puts "\n== Removing old logs and tempfiles =="
       system! 'bin/rails log:clear tmp:clear'
    
    

bin/update

  • rails db:migrateの呼び出しを削除

    diff -uprN rails_app_1/sample_app/bin/update rails_app_2/sample_app/bin/update
    --- rails_app_1/sample_app/bin/update 2018-02-03 20:14:53.000000000 +0900
    +++ rails_app_2/sample_app/bin/update 2018-02-03 20:16:18.000000000 +0900
    @@ -18,9 +18,6 @@ chdir APP_ROOT do
       system! 'gem install bundler --conservative'
       system('bundle check') || system!('bundle install')
    
    -  puts "\n== Updating database =="
    -  system! 'bin/rails db:migrate'
    -
       puts "\n== Removing old logs and tempfiles =="
       system! 'bin/rails log:clear tmp:clear'
    
    

config/application.rb

  • require 'rails/all'を使わず、個別にロード

    diff -uprN rails_app_1/sample_app/config/application.rb rails_app_2/sample_app/config/application.rb
    --- rails_app_1/sample_app/config/application.rb  2018-02-03 20:14:53.000000000 +0900
    +++ rails_app_2/sample_app/config/application.rb  2018-02-03 20:16:18.000000000 +0900
    @@ -1,6 +1,16 @@
     require_relative 'boot'
    
    -require 'rails/all'
    +require "rails"
    +# Pick the frameworks you want:
    +require "active_model/railtie"
    +require "active_job/railtie"
    +# require "active_record/railtie"
    +require "action_controller/railtie"
    +require "action_mailer/railtie"
    +require "action_view/railtie"
    +require "action_cable/engine"
    +require "sprockets/railtie"
    +require "rails/test_unit/railtie"
    
     # Require the gems listed in Gemfile, including any gems
     # you've limited to :test, :development, or :production.
    

ちなみにrequire 'rails/all'をすると

vendor/bundle/ruby/2.4.0/gems/railties-5.1.2/lib/rails/all.rb
require "rails"

%w(
  active_record/railtie
  action_controller/railtie
  action_view/railtie
  action_mailer/railtie
  active_job/railtie
  action_cable/engine
  rails/test_unit/railtie
  sprockets/railtie
).each do |railtie|
  begin
    require railtie
  rescue LoadError
  end
end

以上のソースがロードされます。
--skip-active-recordをしたときは、ActiveRecordは除外するけどActiveModelはロードするという挙動のようです。
まぁMongoidもActiveModelは使いますしね。

config/database.yml

  • ファイルごと削除

    diff -uprN rails_app_1/sample_app/config/database.yml rails_app_2/sample_app/config/database.yml
    --- rails_app_1/sample_app/config/database.yml  2018-02-03 20:14:53.000000000 +0900
    +++ rails_app_2/sample_app/config/database.yml  1970-01-01 09:00:00.000000000 +0900
    @@ -1,25 +0,0 @@
    -# SQLite version 3.x
    -#   gem install sqlite3
    -#
    -#   Ensure the SQLite 3 gem is defined in your Gemfile
    -#   gem 'sqlite3'
    -#
    -default: &default
    -  adapter: sqlite3
    -  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
    -  timeout: 5000
    -
    -development:
    -  <<: *default
    -  database: db/development.sqlite3
    -
    -# Warning: The database defined as "test" will be erased and
    -# re-generated from your development database when you run "rake".
    -# Do not set this db to the same as development or production.
    -test:
    -  <<: *default
    -  database: db/test.sqlite3
    -
    -production:
    -  <<: *default
    -  database: db/production.sqlite3
    

config/environments/development.rb

  • config.active_record.migration_error = :page_load 削除

    diff -uprN rails_app_1/sample_app/config/environments/development.rb rails_app_2/sample_app/config/environments/development.rb
    --- rails_app_1/sample_app/config/environments/development.rb 2018-02-03 20:14:53.000000000 +0900
    +++ rails_app_2/sample_app/config/environments/development.rb 2018-02-03 20:16:19.000000000 +0900
    @@ -34,9 +34,6 @@ Rails.application.configure do
       # Print deprecation notices to the Rails logger.
       config.active_support.deprecation = :log
    
    -  # Raise an error on page load if there are pending migrations.
    -  config.active_record.migration_error = :page_load
    -
       # Debug mode disables concatenation and preprocessing of assets.
       # This option may cause significant delays in view rendering with a large
       # number of complex assets.
    

config/environments/production.rb

  • config.active_record.dump_schema_after_migration = false 削除

    diff -uprN rails_app_1/sample_app/config/environments/production.rb rails_app_2/sample_app/config/environments/production.rb
    --- rails_app_1/sample_app/config/environments/production.rb  2018-02-03 20:14:53.000000000 +0900
    +++ rails_app_2/sample_app/config/environments/production.rb  2018-02-03 20:16:19.000000000 +0900
    @@ -85,7 +85,4 @@ Rails.application.configure do
         logger.formatter = config.log_formatter
         config.logger    = ActiveSupport::TaggedLogging.new(logger)
       end
    -
    -  # Do not dump schema after migrations.
    -  config.active_record.dump_schema_after_migration = false
     end
    

config/initializers/wrap_parameters.rb

  • ActiveSupport.on_load(:active_record) 削除(もともとコメントだけど)

    diff -uprN rails_app_1/sample_app/config/initializers/wrap_parameters.rb rails_app_2/sample_app/config/initializers/wrap_parameters.rb
    --- rails_app_1/sample_app/config/initializers/wrap_parameters.rb 2018-02-03 20:14:53.000000000 +0900
    +++ rails_app_2/sample_app/config/initializers/wrap_parameters.rb 2018-02-03 20:16:19.000000000 +0900
    @@ -7,8 +7,3 @@
     ActiveSupport.on_load(:action_controller) do
       wrap_parameters format: [:json]
     end
    -
    -# To enable root element in JSON for ActiveRecord objects.
    -# ActiveSupport.on_load(:active_record) do
    -#   self.include_root_in_json = true
    -# end
    

db/seeds.rb

  • db/ディレクトリごと削除

    diff -uprN rails_app_1/sample_app/db/seeds.rb rails_app_2/sample_app/db/seeds.rb
    --- rails_app_1/sample_app/db/seeds.rb  2018-02-03 20:14:53.000000000 +0900
    +++ rails_app_2/sample_app/db/seeds.rb  1970-01-01 09:00:00.000000000 +0900
    @@ -1,7 +0,0 @@
    -# This file should contain all the record creation needed to seed the database with its default values.
    -# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup).
    -#
    -# Examples:
    -#
    -#   movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }])
    -#   Character.create(name: 'Luke', movie: movies.first)
    

test/test_helper.rb

  • fixtures :all 削除

    diff -uprN rails_app_1/sample_app/test/test_helper.rb rails_app_2/sample_app/test/test_helper.rb
    --- rails_app_1/sample_app/test/test_helper.rb  2018-02-03 20:14:53.000000000 +0900
    +++ rails_app_2/sample_app/test/test_helper.rb  2018-02-03 20:16:19.000000000 +0900
    @@ -2,8 +2,5 @@ require File.expand_path('../../config/e
     require 'rails/test_help'
    
     class ActiveSupport::TestCase
    -  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
    -  fixtures :all
    -
       # Add more helper methods to be used by all tests here...
     end
    

以上