0

eBay に似たオークション ハウスを作成しています。私の質問は入札リソースに関するものです。配置されたすべての入札を追跡します。しかし、私は、アイテムのすべての新しい入札が現在の入札よりも高いことを確認しなければなりません。そうしないと、オークションの目的が無効になります。

私が現在これを行う方法は、入札コントローラー内でトランザクションを作成することです。これは、アイテムの入札額が同じアイテムの他の入札の最大値よりも大きいかどうかを確認します。

def create
    bid.transaction 
      @bid = Bid.new(params[:bid])
      @bid.user = current_user
       @bid.item = current_item
       # DO STUFF TO CHECK ITS GREATER THAN MAX OF BIDS FOR CURRENT_ITEM
       # ON ERROR, ROLLBACK TRANSACTION AND THROW ERROR

    end
end
4

2 に答える 2

2

私は間違いなくモデルでこれを処理します。次のようなカスタム検証を作成します。

#Bid Model
validate :bid_is_higher_than_current_highest

private
def bid_is_higher_than_current_highest
  bid > item.current_highest_bid
end

そんな感じ。

于 2012-11-20T18:04:09.970 に答える
0

まず、トランザクションをサポートしていないInnoDBテーブル タイプを使用していることを確認してください。MyISAM

しかし、基本的には正しいです。トランザクション内でクエリを実行して、最大入札額を決定したいだけです。

max_bid_amount = Bid.where(:id => item.id).maximum(:bid_amount)
if @bid.bid_amount > max_bid_amount
  # proceed with bid placement
else
  # do something, return some flag, nil or whatever
end

次に、値を確認し、それに応じて続行します。フロー制御の目的で例外を発生させたくないと思います。

また、このロジックをコントローラーの外に移動し、モデルまたはその他の管理レイヤーに移動することをお勧めします。おそらくBidManager、入札の配置のためのフロー ロジックを含む一般的な Ruby クラスを使用することをお勧めします。

于 2012-11-20T18:01:15.500 に答える