やったこと
従来はクーポンはどのタイミングでも利用可能だったが、初回限定クーポンや2回目以降限定クーポンも導入する必要が出てきたのでクーポンの利用範囲を設定できるようにした。おおまかな流れは、
- Active Recordの機能で、データベースにクーポン利用範囲のカラムを追加。
- クーポン利用範囲に入る値を設定
- GraphQLのmutationロジック実装
という感じで進めた。
ActiveRecord概要
ActiveRecordとは端的にいうと「DBの操作をRubyでできるようにした機能」である。
本来DB操作はSQL文で行うが、Rubyで行えるようになることでコードがRubyで統一されることがメリットと言える。詳細は以下。
クーポン適用可能範囲のカラムを追加
migrationファイルを生成する。カラム名、追加するテーブル名、カラムの型を指定する。
coupons
テーブルにcoupon_scope
という名前の整数値のカラムを追加する場合は
$ rails generate migration add_coupon_scope_to_coupons
を叩くことでmigrationファイルが生成される。
ちなみにカラムの変更はまだschema.rbには反映されていない。
migrationの実行
以下のコマンドでmigrationファイルを元にカラムが実際に追加される。schemaにも反映される。
$ rails db: migrate
これにより追加した差分のmigrateが実行される。
modelsでカラムに入り得る値を設定。
modelsで具体的なクーポンの利用範囲を設定する。今回は全範囲、初回限定、2回目以降の3パターンの利用範囲を設定した。文字列ではなくenum型で設定。
enum coupon_scope: { all_scope: 0, first_order: 1, from_the_second_order: 2 }
管理画面でscopeが使えるようにした。
このプロジェクトでは管理画面はadministrateと呼ばれるrailsのライブラリを使用している。
ここで、administrateの各項目にcoupon_scope
を追加して、管理画面でクーポンに利用範囲を設定できるようにした。
administrateの詳細は以下の記事などで確認できる。
入力されたクーポンが利用可能かどうかの判定ロジック実装
frontendで入力されたクーポンコードが利用範囲外で使えない場合はエラー文を表示する。
例えば、2回目の注文時に初回限定クーポンのコードを入力した場合は「ここでは利用できません」と表示。
GraphQLのクーポン関連のmutationを確認する。
本プロジェクトではfrontとbackのデータの受け渡しにはGraphQLが用いられている。そのためfrontで入力されたクーポンコードをbackendで判定するにはGraphQLのmutationにロジックを書き加える必要がある。
def resolve
Gql::Mutations::Coupon.new().call
end
クーポン関連のmutationファイルにはこんな雰囲気のresolveメソッドが定義されている。
ここからわかるのは、具体的なクーポン判定ロジックはCouponクラス内で定義されているcallで呼ばれているメソッドに書くべきだということ。
Couponクラスを確認する。
Couponクラス内のcallで呼ばれているmodels内のメソッドを書き換える。尚、今回の話に関係ない部分のコードは省略してある。
def check_coupon(coupon_code)
coupon = Coupon.where(code: coupon_code).first
# Coupon code can not be used
raise StandardError.new('このクーポンコードはここでは使えません') if (coupon.first_order? && "2回目以降のorderである") || (coupon.from_the_second_order? && "初回のorderである")
end
StandardErrorは例外処理で使えるらしく、エラーメッセージを出すときによく使うらしい。詳しくはこちらの記事で。
これで期待する動作が無事に確認できた。
まとめ
今回のタスクの変更点は、
- 管理画面からクーポンに3種類の利用範囲(全範囲、初回限定、2回目以降限定)を設定できるようになった。
- ユーザーの注文が入力されたクーポンコードの利用範囲外だった場合、ユーザーに警告文を表示する。
である。
backendとfrontendの繋がりが意識できるタスクで、すごくいい経験になった。