やりたいこと
社内研修で、ウォーターサーバーの替えのボトルの在庫を見張って自動発注するというプチIoTシステムをRailsで開発しています。
Railsで注文データのダミーを作りたかったのですが、調べても意外にそれっぽいハウツーに出会えなかったのでメモ。(自分のぐぐり力不足?)
ちなみに、注文モデル(order.rb)には以下のカラムがあります。
カラム | データ型 | |
---|---|---|
delivery_date | date | 納品日 |
qty | integer | 注文数 |
order_date | date | 注文した日付 |
status | integer | 0: 注文済み、1: 納品済み |
created_at | datetime | |
updated_at | datetime | |
item_id | bigint | 注文アイテムの外部キー |
user_id | bigint | 注文したユーザーの外部キー |
ちなみに、環境。
Rails6.0.3, macOS Catalina 10.15.7
実装!
今回はFakerというgemを活用して、ダミーの注文データを30個生成します。
(gemとは?=>Railsをさらに便利にしてくれるライブラリ(=拡張機能=オプション機能=カスタマイズ機能)みたいなやつ)
Fakerそのもののインストールの仕方に関してはネットにたくさん記事があるので割愛します。
# 最新の注文は個別で作る
order_date = Faker::Date.between(from: 5.days.ago, to: Date.today)
Order.create(
order_date: order_date,
qty: Faker::Number.between(from: 1, to: 10),
delivery_date: order_date + 3, # 納品日は注文日の3日後としておく。下に詳述。
status: 0,
user_id: 2,
item_id: 1)
# 残り29個はランダムで生成してもらう
29.times do
order_date = Faker::Date.between(from: 1.year.ago, to: 10.days.ago)
Order.create(
order_date: order_date,
qty: Faker::Number.between(from: 1, to: 10),
delivery_date: order_date + 3,
status: 1,
user_id: Faker::Number.between(from: 1, to: 2),
item_id: Faker::Number.between(from: 1, to: 3)
)
end
↑コードを見れば何をしたいか大体わかると思うので、解説は加えません。
これ以外の実装がしたい場合は、Fakerはその辺のチュートリアル記事よりも、本家に当たるのが吉でしたのでこちらを参照すると良いと思います。
Fakerドキュメント https://github.com/faker-ruby/faker#faker
Faker::Date https://github.com/faker-ruby/faker/blob/master/doc/default/date.md#fakerdate
ちなみに、当初、delivery_dateもFakerしようと思ったのですが、そうすると、delivery_date(納期)がorder_date(注文日)よりも前になってしまうなど整合性が取れないデータが発生することを懸念し、order_date + 3
という計算にしました。
余談ながら、この計算方法(文法)で合っているかは、ターミナルでrails db:seed
する前に、rails consoleで確認できることを発見!↓
% rails console
Running via Spring preloader in process 48085
Loading development environment (Rails 6.0.3)
irb(main):001:0> order_date = Faker::Date.between(from: 1.year.ago, to: 10.days.ago)
=> Tue, 09 Jun 2020
irb(main):002:0> order_date + 15
=> Wed, 24 Jun 2020
irb(main):003:0>
生成!
ターミナルでrails db:seed
すると下記のようにデータが生成されました!↓
最後に
何かご指摘やもっといい方法などあればぜひ教えてください。
ありがとうございます。