【seed】rails db:seedで db/seeds.rb以外を読み込む場合


問題

db/seeds/product_suggest.rbに配置してあるデータ

[
  'toothbrush',
  'tooth paste',
  'eye drops',
  'water',
  'tape',
  'eraser',
  'pencil',
  'shirt',
  't-shirt',
  'towel',
].each do |keyword|
  Product::Suggest.create!(keyword: keyword)
end

こちらを、テーブルに読み込ませたいが、今まではdb/seeds.rbに記述したテータのみしか読み込ませた事がなかった。
この場合どのように設定するか検索し、対処した。

検証環境

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.3
BuildVersion:   19D76
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin19]
$ rails -v
Rails 5.2.4.2

テーブルの作成

まず、データを流し込むテーブルを作成する。

rails g  model suggest keyword:string

この時、db/seeds/product_suggest.rbで

].each do |keyword|
  Product::Suggest.create!(keyword: keyword)
end

と各データを、keywordとしてcreateしているので、
keyword:stringとカラムを設定する。

もしモデル名を間違えてしまった場合等、rails g(generate) で作成したものを削除したい場合は、

rails destroy model suggest

等とする。

クラス名変更

rails g modelするとその後、
app/models/に
suggest.rbが作成される。

この時、/product_suggest.rbの記述に合わせる為、
app/models/以下にproductファイルを作成し、
その中に、suggest.rbを移動させ、以下のような配置にした。

app/models/product/suggest.rb

更に、suggest.rbのクラス名が最初は、

class Suggest < ApplicationRecord
end

という記述になっているので、
これも合わせる為に、

class Product::Suggest < ApplicationRecord
end

に変更する。

db/seeds.rbの編集

このまま、rails db:seedとしても、読み込まれるのは、db/seeds.rbだけなので、
db/seeds.rbに以下を追加する。

Dir.glob(File.join(Rails.root, 'db', 'seeds', '*.rb')) do |file|
  load(file)
end

こちらを記述することで、db/seeds/ディレクトリ以下のファイルで'*.rb'となっているものをすべて読み込んでくれる。

その後、ターミナルで、

rails db:migrate

マイグレーションファイルからsuggestテーブル作成

rails db:seed

データを流し込む。

データの確認

rails dbconsole
mysql> show tables;

テーブル一覧から新規作成できているか確認
shell
mysql> select * from suggests;

テーブル内容の確認。
これでデータが入っている事が確認できる。

rails consoleでも可。

今回の失敗

最初に、

].each do |keyword|
  Product::Suggest.create!(keyword: keyword)
end

という部分をみて、

rails g  model product_suggest keyword:string

と間違ったモデル名で作成してしまった。
これだと、クラス名は、product_suggestのスネークケースから、Rubyのクラスにされる際に、ProductSuggestのキャメルケースに変換され。読み込むファイル(今回だとdb/seeds/product_suggest.rb)に記述されている内容と違ってくる。
このあたりのクラス名とモジュール名の関係を確認できて良かった。今後気をつけていきた

終わりに。

最後まで読んで頂きありがとうございます
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。