はじめに
ローカル環境ではMYSQLに直接データベースの情報を入力していたのに
本番環境ではどのように入れたら良いかわからなーーーい!!
という方に必見です!!
※「Ruby on rails」を用いて作業しておりますので
そのことに関する情報のアウトプット記事となっております!!
1.モデルの作成
使用するアプリは
①moviesテーブル
②genresテーブル
③movie_genresテーブル(中間テーブル)
のデータを持っているとします。
それぞれのモデルとマイグレーションファイルを作成します。
rails g model movie title:string content:text --timestamps=false
# movieのモデルとマイグレーションファイルが生成される。
rails g model genre name:string --timestamps=false
# genreのモデルとマイグレーションファイルが生成される。
rails g model movie_genre movie_id:integer genre_id:integer --timestamps=false
# movie_genreのモデルとマイグレーションファイルが生成される。
それぞれのモデルの関係性は下記の通りです。
class Movie < ApplicationRecord
has_many :genres, through: :movie_genres
has_many :movie_genres
end
class Genre < ApplicationRecord
has_many :movies, through: :movie_genres
has_many :movie_genres
end
class MovieGenre < ApplicationRecord
belongs_to :movie, optional: true
belongs_to :genre, optional: true
end
※Rails5からデフォルトで外部キーのnilが許可されなくなったので、 nilを許可する場合は以下のようにbelongs_to へoptional: trueを設定する必要があります。
2.テーブルの作成
rails db:migrate # マイグレーションを実行し、テーブルを作成。
テーブルができるので
ここからが本番環境でも適応されるデータベースへの書き込み方になります!!
3.seed.rbの記述をし本番環境でテーブル情報を反映
seed.rbに下記のように入力します。
Movie.create!(
title: 'トイストーリー',
content: 'おもちゃが動き出すよん',
)
#映画のtitleとcontentを入力
#書き方は他にもいろいろあるみたいですけど私はこの書き方にしました。
Genre.create!(
name: 'アニメーション',
)
Genre.create!(
name: 'アドベンチャー',
)
#ジャンルのnameを入力
この状態で
rails db:seed
を入力するとローカル環境のデータベースで反映されています。
これらのデータを入力し終えたらリモートにpushしましょう。
では続けて本番環境で
[ec2-user@******* ~]$ cd /var/www/アプリケーション名/
[ec2-user@******* アプリケーション名]$ cd current/
[ec2-user@******* current]$ rake db:seed RAILS_ENV=production
を入力すると本番環境でも
①moviesテーブル
②genresテーブル
が反映されることができました。
では続いて
③movie_genresテーブル(中間テーブル)を本番環境で反映させたいと思います。
1.SQLに直接記述し本番環境で中間テーブル情報を反映
seed.rbに中間テーブルデータを記述する方法もあるとは思うのですが、
自分では調べてもできなかったのでSQLに直接書く方法を記述します。
本番環境で下記を記述
[ec2-user@******* current]$ mysql -u root -p
# Enter password: とパスワードを入力するように表示されるので、MySQLのrootパスワードを入力して、Enterしてください。
mysql> SHOW DATABASES;
# SQL文を実行すると今まで作ってきたデータベースが一覧で表示されます。
mysql> USE 対象となるデータベースを入力;
# USEで指定したデータベース内を操作できるようにします。
mysql> INSERT INTO movie_genres (movie_id, genre_id) VALUES (1, 1);
mysql> INSERT INTO movie_genres (movie_id, genre_id) VALUES (1, 2);
# これらを入力することで中間テーブルに情報を反映させることができます。
これで③movie_genresテーブル(中間テーブル)の情報も本番環境で反映させることができました。
他にもやり方はあると思いますが私はこのやり方でテーブル、
中間テーブルの情報を本番環境でも反映させることができました。
おわりに
説明した方法以外にもやり方はあると思いますので他の方法が見つかれば
情報共有してもらえればありがたいです!!!
最後まで見てもらいありがとうございました!!