0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Active Recordの機能でクーポンの利用範囲を導入

Last updated at Posted at 2023-10-17

やったこと

従来はクーポンはどのタイミングでも利用可能だったが、初回限定クーポンや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型で設定。

coupon_mutation.rb
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にロジックを書き加える必要がある。

coupon_mutation.rb
def resolve
      Gql::Mutations::Coupon.new().call
end

クーポン関連のmutationファイルにはこんな雰囲気のresolveメソッドが定義されている。
ここからわかるのは、具体的なクーポン判定ロジックはCouponクラス内で定義されているcallで呼ばれているメソッドに書くべきだということ。

Couponクラスを確認する。

Couponクラス内のcallで呼ばれているmodels内のメソッドを書き換える。尚、今回の話に関係ない部分のコードは省略してある。

order.rb
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の繋がりが意識できるタスクで、すごくいい経験になった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?