あるデータが作成されてから、一定期間が経過したらアプリ側で自動的にそのデータの状態が変わり、変わるまでは新規でデータ作成ができない、という機能を実装したいです。
具体的な仕様は以下のようなものです。
・UserモデルとShopモデルはOrderモデルをthroughして多対多の関係
・Orderモデルは、その注文の状態を表す「status:string」カラムを持つ。
・その「status」は、「"not_read", "review", "accept", "reject"」という値のいずれかを持つ
ここまでを、以下のコードで記述しています。
Ruby
1#モデル 2class User < ActiveRecord::Base 3 has_many :shop, through:orders 4 has_many :orders, dependent: :destroy 5end 6 7class Shop < ActiveRecord::Base 8 has_many :users, through: :orders 9 has_many :orders, dependent: :destroy 10end 11 12class Order < ActiveRecord::Base 13 belongs_to :shop 14 belongs_to :user 15 16 ORDER_STATUS = %w(not_read review accept reject).freeze 17 validates :order_status, inclusion: { in: ORDER_STATUS } 18 19 class << self 20 def order_status_text(status) 21 I18n.t("activerecord.attributes.order.status_#{status}") 22 end 23 end 24end
Ruby
1#コントローラー 2class OrdersController < ApplicationController 3 4 def new 5 @shop = Shop.find(params[:id]) 6 @order = Order.new 7 end 8 9 def create 10 @order = Order.new( order_params ) 11 12 respond_to do |format| 13 if @order.save 14 format.html { redirect_to current_shop, notice: '注文が完了しました' } 15 format.json { render :show, status: :created, location: @order } 16 else 17 format.html { render :new } 18 format.json { render json: @order.errors, status: :unprocessable_entity } 19 end 20 end 21 end 22 23end
ビューでは、注文内容に加え、:shop_idと:user_idをhidden_fieldでcreateに渡しています。
ここまでで、とりあえずuserはshopに注文を出来るようになったのですが、ここから先の仕様の実装方法にわからない箇所があります。
1.userがshopに対して持つorder.statusは、デフォルトでは「not_read」
2.shopがshowメソッドでorderを確認した時、order.statusは「review」に変更
3.reviewに変更した時間を取得し、そこから10日が経ったら自動的にorder.statusを「reject」に変更
4.order.statusが「reject」もしくは「accept」になってから3日後に、再度userは同じshopにorderできるようになる
1,2については実装しているのですが、3,4の実装方法がわかりません。
3では値を自動で変更する必要があり、4では値が「rejectかaccept」に変更されてからの時間を取得してバリデーションを組む必要があるのかな、とは考えているのですが、その具体的な記述方法に頭を抱えています。
orderの削除については過去のorder全てをデータベースには残したいため、orderを削除するのではなく「reject」というフラグを持たせて削除したように見せているつもりです。
大変お手数ですが、ご回答いただけますと助かりますm(__)m
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/04 07:42