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

然后检查该值并相应地进行。我认为您不想出于流量控制目的而引发异常。

我还建议您将此逻辑移到控制器之外,并移至模型或其他管理层,可能有一个通用的 Ruby 类,例如BidManager其中包含投标放置的流逻辑。

于 2012-11-20T18:01:15.500 回答