search
LoginSignup
5

More than 3 years have passed since last update.

Organization

Rails6 のちょい足しな新機能を試す95(db:prepare 編)

はじめに

Rails 6 に追加された新機能を試す第95段。 今回は、 db:prepare 編です。
Rails 6 では、 db:prepare という rake タスクが追加されました。

データベースが存在しないときは、データベースを作成してから、 schema.rb からテーブルを作成(ロード)し db:seed を実行します ( db:setup と同じ動作 )。
データベースが存在するときは、 db:migrate を実行します。

Ruby 2.6.4, Rails 6.0.0 で確認しました。

$ rails --version
Rails 6.0.0

今回の下準備

今回は Rails6 のちょい足しな新機能を試す93(ActiveRecord extract_associated編) を利用して確認します。

一旦 db:drop する。

動作確認のため、一旦 db:drop します。

$ bin/rails db:drop

bin/rails db:prepare を実行する

$ bin/rails db:prepare
Created database 'app_development'
Created database 'app_test'

データを確認する

bin/rails console でデータを確認します。

development 環境はデータができていることがわかります。

$ bin/rails c
Running via Spring preloader in process 649
Loading development environment (Rails 6.0.0)
irb(main):001:0> Book.all
  Book Load (0.2ms)  SELECT "books".* FROM "books" LIMIT $1  [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<Book id: 1, title: "Pragmatic Programmer", author_id: 1, created_at: "2019-09-28 11:41:53", updated_at: "2019-09-28 11:41:53">, #<Book id: 2, title: "Programming Ruby", author_id: 1, created_at: "2019-09-28 11:41:53", updated_at: "2019-09-28 11:41:53">, #<Book id: 3, title: "Agile Web Development with Rails 6", author_id: 1, created_at: "2019-09-28 11:41:53", updated_at: "2019-09-28 11:41:53">, #<Book id: 4, title: "Agile Web Development with Rails 5.1", author_id: 1, created_at: "2019-09-28 11:41:53", updated_at: "2019-09-28 11:41:53">, #<Book id: 5, title: "The Ruby Programming Language", author_id: 2, created_at: "2019-09-28 11:41:53", updated_at: "2019-09-28 11:41:53">, #<Book id: 6, title: "Programming Python", author_id: 3, created_at: "2019-09-28 11:41:53", updated_at: "2019-09-28 11:41:53">]>

db:create した状態で db:prepare を実行する

db:drop db:create してから db:prepare を実行します。

db:drop db:create を実行します。

$ bin/rails db:drop db:create
Dropped database 'app_development'
Dropped database 'app_test'
Created database 'app_development'
Created database 'app_test'

db:prepare を実行します。

$ bin/rails db:prepare
== 20190927002833 CreateAuthors: migrating ====================================
-- create_table(:authors)
   -> 0.0098s
== 20190927002833 CreateAuthors: migrated (0.0098s) ===========================

== 20190927002849 CreateBooks: migrating ======================================
-- create_table(:books)
   -> 0.0201s
== 20190927002849 CreateBooks: migrated (0.0202s) =============================

books テーブル, authors テーブルのデータを確認するとデータはできてません。 db:seed は実行されていません。

irb(main):001:0> Book.all
  Book Load (0.2ms)  SELECT "books".* FROM "books" LIMIT $1  [["LIMIT", 11]]
=> #<ActiveRecord::Relation []>
irb(main):002:0> Author.all
  Author Load (0.3ms)  SELECT "authors".* FROM "authors" LIMIT $1  [["LIMIT", 11]]
=> #<ActiveRecord::Relation []>

db:setup との違い

db:setup は、 データベースが存在するときの動作が、 db:prepare とは異なります。
schema.rb からテーブルを作成し直して、seed データを投入します。
また、実行していないマイグレーションがあるとメッセージを表示します。
(db:setup 実行前の状態には戻りません。 db:setup 実行時の schema.rb によりテーブルの再作成は実行されます。)

$ bin/rails db:setup
Database 'app_development' already exists
Database 'app_test' already exists
You have 1 pending migration:
  20190927002849 CreateBooks
Run `rails db:migrate` to update your database then try again.

試したソース

試したソースは以下にあります。
https://github.com/suketa/rails_sandbox/tree/try093_extract_associated

参考情報

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
5