Open15

Docker環境下のRailsで食品栄養成分表をDBに登録

dockerでRailsの環境を作成

下記の記事を元にRailsの新規プロジェクト環境を作成できるテンプレートファイルを作成

https://zenn.dev/tmasuyama1114/articles/rails-docker-6x-how-to

webpackerとはなにか?

Railsの環境構築にあたり「webpacker」というものがでてきたので調査。「webpack」とは違うの?
ざっくり言うと、Railsのプロジェクトでwebpackを楽に使えるようにしたもの。
詳細については下記の記事に書いてある。

https://qiita.com/jesus_isao/items/1f519b2c6d53f336cadd

module bundlerとは

モジュールバンドラー(module bundler)は、文字通りモジュールをひとまとめにする(bundle)ツール。モジュールバンドラーの代表格のひとつである webpack でも使用されている言葉。 ひらたく言うと、JavaScriptの依存関係を解決し、それらをインクルードしたひとつのファイルにまとめてくれるもの。
module bundler jsファイルでの例え

docker落とした後再起動時にwebサーバーが起動しなくなった

log通りに対応

 ========================================
   Your Yarn packages are out of date!
   Please run `yarn install --check-files` to update.
 ========================================

https://qiita.com/nakki/items/4fa58cb6ff4d6c24c2d2

Railsのgitignore作成

*.rbc
capybara-*.html
.rspec
/db/*.sqlite3
/db/*.sqlite3-journal
/db/*.sqlite3-[0-9]*
/public/system
/coverage/
/spec/tmp
*.orig
rerun.txt
pickle-email-*.html

# Ignore all logfiles and tempfiles.
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep

# TODO Comment out this rule if you are OK with secrets being uploaded to the repo
config/initializers/secret_token.rb
config/master.key

# Only include if you have production secrets in this file, which is no longer a Rails default
# config/secrets.yml

# dotenv, dotenv-rails
# TODO Comment out these rules if environment variables can be committed
.env
.env.*

## Environment normalization:
/.bundle
/vendor/bundle

# these should all be checked in to normalize the environment:
# Gemfile.lock, .ruby-version, .ruby-gemset

# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
.rvmrc

# if using bower-rails ignore default bower_components path bower.json files
/vendor/assets/bower_components
*.bowerrc
bower.json

# Ignore pow environment settings
.powenv

# Ignore Byebug command history file.
.byebug_history

# Ignore node_modules
node_modules/

# Ignore precompiled javascript packs
/public/packs
/public/packs-test
/public/assets

# Ignore yarn files
/yarn-error.log
yarn-debug.log*
.yarn-integrity

# Ignore uploaded files in development
/storage/*
!/storage/.keep
/public/uploads

https://github.com/github/gitignore/blob/master/Rails.gitignore

docker環境でrailsコマンドの使用の仕方

docker-compose run web railsのコマンド

これだとdocker-compose run webと毎回入力するのがめんどくさい。。。
そこで下記コマンドで一旦コンテナの中に入ってしまえば後はrailsコマンドを打つだけで済む。

docker container exec -it コンテナ名 bash

コンテナ名の確認方法

動作しているコンテナのみ表示

docker ps

動作・停止しているコンテナを表示

docker ps -a

Rails controller 作成の仕方

rails g controller コンテナ名

ggenerateの省略記法

スプレッドシートの操作方法

下記を参考に行なった。

https://techblog.gmo-ap.jp/2018/12/04/ruby_google_sheets_drive/

こんなものもあった。

https://github.com/googleapis/google-api-ruby-client/blob/main/docs/usage-guide.md
google_drivegoogle-apis-driveの違いを調べてみた。
https://rubygems.org/gems/google_drive/versions/2.1.4?locale=ja
google-apis-drivegoogle_driveの中に内包されているようで、スプレッドシートの読み書きを行う場合はgoogle_driveを使用すればよさそう。

google-apis-driveのメモ

初め、google-apis-drive_v2を使用した時のエラー(google_driveを使用したので使わなかったけどメモしておく)
エラー

どうもgoogle-apis-driveはバージョンがv3まである様子。
バージョンを変更してあげる必要があった。

require google_driveでもエラーが出た

こちらを利用してもエラーが出てしまった。。

https://stackoverflow.com/questions/42255271/google-drive-gem-not-working-loaderror-cannot-load-such-file-google-drive
読むとgemに記載し、bundleした後でもgem install 'google_drive'を実行する必要がある様子。

しかし、これでもできない。。。
もしかしてdockerをbuildし直す必要があるのか??

docker compose build

再起動して確認してみると、、エラー解消された🙌

エラー発生

config.jsonにclient_id,secret_idともに記載されているのにないとエラーがでる。
ここでものすごく時間がかかってしまった、、

https://www.youtube.com/watch?v=VqoSUSy011I
この通りにやったらできた。
OAuthクライアントIDではなくサービスアカウントで行うやり方。

スプレッドシートから読み取り

栄養素表
このスプレッドシートのサンプル栄養素表から各項目を読み取る。

        # 栄養素取得
        @nutrients = []
        (2..@@sheets.num_cols).each do |col|
            @nutrients.push(@@sheets[1, col])
        end
        p "栄養素:#{@nutrients}"

        # 食品名取得
        @foods = []
        (2..@@sheets.num_rows).each do |row|
            @foods.push(@@sheets[row, 1])
        end
        p "食品:#{@foods}"

行を取得しそのまま操作しようとした際の注意事項

# 栄養素取得
@nutrients = @@sheets.num_rows[0].shift()

shift()で先頭の「食品名」だけ削除したほうが効率よさそうなので試してみたが、
freezeされておりerrorがでた。
そのため上記のように直接担当の箇所を読み取るようなやり方をしている。

DBについて調査

この栄養素をどのようなDB設計で登録するのがよいのか決めるため、下記記事をざっくりと読んだ。

https://zenn.dev/hajime_shoji/articles/9abaaa5d10264ea7412c
https://qiita.com/ramuneru/items/32fbf3032b625f71b69d
https://it-koala.com/entity-relationship-diagram-1897#ER
https://zenn.dev/yhay81/articles/9fa94a589b33ad

DB設計にあたりER図を描けるようになりたいと思う。

ER図作成ツール

LucidChartを使用しようと思う。
直感的に操作でき、ラーニングコストが少なそうな印象を受けたのが選んだ理由。

DB作成

下記の記事を参考にDBとmodelを作成。

https://zenn.dev/tmasuyama1114/articles/rails-create-table
https://www.javadrive.jp/rails/ini/index6.html#section1

命名規則

model名やカラム名を決める際に下記の記事を参考にした。
有名どころのサイトの中でクックパッドがrailsを使用しているとのことで見てみた。

https://qiita.com/gakkie/items/3afcd505c786364aa5fa
https://github.com/cookpad

データ型

データ方について曖昧な部分があるため再度確認。

https://blog.proglus.jp/695/

テーブル確認

https://qiita.com/kouuuki/items/b6e1a4318d8feee24c9f
rails dbconsole

で下記のエラー発生
Couldn't find database client: mysql, mysql5. Check your $PATH and try again.

下記記事を見つけた

https://programmingmemo.com/docker-dbconsole/
https://omathin.com/docker-compose-run-web-rails-dbconsole-error/
どうもmysql-clientがないようだ
mariadb-clientを追加し、dockerをbuildしなおしたら解消された。

ちなみにmariadbでのテーブル確認方法はこれ

show tables;
ログインするとコメントできます