質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

5463閲覧

Railsでポイント機能を実装したい。。

ohamadayo

総合スコア11

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2018/07/28 05:28

Ruby on rails で開発を行っている初心者です。
只今、ECサイトを制作しているのですが

サイト内で商品を購入する際に、支払いのAPIではなくサービス内で使えるポイントでの購入機能を実装したいと考えています。

具体的には、
①ユーザーがプリペイドカードの番号をフォームで入力し送信
②管理者が番号を確認後、額に見合ったポイントを付与(ここは手動?)
③ユーザーは付与されたポイントを使いサイト内で買い物ができる

という処理を想定しています。

現状としては
Userテーブル(user_id,emailカラム,nameカラム)
Orderテーブル(quantityカラム、serviceカラム,priceカラム)があり

UserテーブルとOrderテーブルは紐付けてあり、発注機能は完成しています。

初心者ながらこれらの処理に関して
①Userテーブルにpointカラム(:integer)を追加
②(ポイント付与をどのように実装したら良いかわからない..)
③購入が確定されると、User.pointからOrder.priceが引かれる

という流れなのかな、とざっくり考えているのですが、どなたかご教授願えませんでしょうか
よろしくお願いいたします。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

おそらくそれほど頻繁にポイントの発行や利用が発生しないと思うので(頻繁に発生するようなシステムを初心者が作るのはとてもおすすめできません)、効率はさておき確実性で話をすると、pointカラムをUserテーブルにつけるだけではダメです。Pointテーブルを作って全発行履歴・利用履歴を記録するのをおすすめしておきます。

Pointテーブル(id, user_id,ポイント数(Integer),order_id,発行理由)

などのカラムを用意します。
ポイント付与時にはポイントの対象ユーザとポイント数、発行理由(テキストなり理由IDなり)を記録し、
購入時にはポイント利用ユーザとポイント数(マイナス)、Orderのidなどを記録します。

ポイント残高の計算はuser_idをキーにポイント数をsumする感じです(SQLで書いたほうがいいかも)。user_idにはインデックスを張らないとそのうち遅くなって死にます。場合によってはUserテーブルにpointカラムを持たせて、画面表示時にはそちらを使ってもよいですが、計算するときには必ずPointテーブルで計算するべきです(User.pointはポイント値のキャッシュくらいに考えてください)。

Pointテーブルは基本的にINSERTのみで、UPDATE・DELETEはしないようにします(order.save()がコケたときにはrollbackはするようにします。トランザクションの使い方もマスターしましょう)。これは何かトラブルが起きた時にポイント発行履歴を確実に追えるようにするためです。

規模が大きくなるともう少し工夫をしないといけなくなるはずですが、その頃には利益が上がっていて、詳しい人に有償で相談できるようになるといいですね。事故だけはくれぐれも気をつけて、がんばってください。

投稿2018/07/28 06:02

takahashim

総合スコア1877

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ohamadayo

2018/07/30 10:09

ご回答ありがとうございます! 改めてど素人がたいそれた物を作ろうとしちゃってることを実感しました:: amazonギフト券のコードの確認は手動じゃないと厳しいので付与もまた、自動化は厳しいかと思い、当面は発行理由に関しては追わない形で。 結局はガバガバな作りであることは承知の上で、ポイントはユーザーテーブルのpointカラムで、ポイント付与に関しては手動でActiveAdminを使いデータの中身を手動で弄ることで実現し、ポイントで購入した物の値段履歴に関しては、Orderテーブルのpriceカラムにて管理。 残りのポイント残高に関しては、@user = current_user @user.pointで 購入のアクション毎に current_user.point.to_i から orderテーブルのpriceカラム.to_i を引くという流れで処理で実装することに決めました。。:: この度はご回答のほど誠にありがとうございました! 限度を感じてきたらpointテーブルのやり方をバイブルとして実装してみようと思います!
takahashim

2018/07/30 10:25

いやー、繰り返しになりますが、@user.pointだけでポイント管理するのは絶対に止めた方がいいですよ。バグった時に収集つかなくなりかねないので。 どうしてもどうしても@user.pointだけで何とかしたい、ということであれば、発行履歴と利用履歴について、テキストファイルのログでもメールでもいいので、別途必ず全部記録するようなしくみを用意しておくことを強くおすすめしておきます。 記録が何も残らないと、何よりユーザが迷惑しますし、ユーザのサポートをするのも大変になります。DBじゃなくてもいいので、とにかく何かしら必ず記録が残るようにしておきましょう。 ちなみにこれはポイント履歴ではなく、購入履歴についても同様です。 もっとも、特に何もなければ購入履歴をあとから更新することはあまりないかと思いますが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問