我的应用程序有一些交易,一旦达到最低订单金额,就会进行订单。目前,我有一些设置订单,这些订单是在提交订单后立即下的,这一切都在进行中。
现在我需要更改流程,以便在满足交易的最低订单号后处理订单。
我应该使用delayed_job还是使用cron进程?
以下是我想遵循的过程。
延迟订单,直到订单达到最低
- 查找仍然有效的交易
- 然后找到满足最低订单数量的交易
- 对于每个交易订单,循环查看并处理每个订单的捕获
- 发送订单确认
我的订单模型购买方法
def purchase
response = OrderTransaction.gateway.purchase(order_amount, credit_card, options)
transactions.create!(:action => "purchase", :amount => order_amount, :response => response)
response.success?
end
我的订单控制器中的创建方法。
def create
@member = current_member
@order_deal = Deal.find(params[:deal_id])
@order = @order_deal.orders.build(params[:order])
@order.member_id = current_member.id
@order.ip_address = request.remote_ip
@deal = @order_deal
if @order.save
if @order.purchase
MessageMailer.order_receipt(@order, @member).deliver
render :action => "success"
flash[:notice] = "Successfully created order."
else
render :action => "new"
end
else
render :action => 'new'
end
end
我正在Heroku上运行这个应用程序。感谢您的帮助。
如果我理解正确的话,基本上是一群人必须在任何人获得交易之前下订单,比如groupon。如果是这样,一种更简单的方法可能只是在每次下新订单时检查是否下了最低数量的订单。所以说最少是两个订单,你下第一个订单,然后你的订单被记录到数据库中,但没有处理,然后我下订单。当我的订单被下到你的应用程序时,它会触发一个条件,可能是在模型层中通过before_save,然后应用程序提取交易的所有订单并进行处理。这个实现很好,因为你不必经常检查第二个过程(延迟作业),看看是否达到了最低要求。一旦达到阈值,延迟作业可能有助于处理所有订单。
以下是一些模型的示例代码(理论上也可以在控制器中进行)
before_save :check_if_minimum_has_been_met
def check_if_minimum_has_been_met
if deal.minimum_orders < deal.orders + 1 #to count the current order
#execute the delayed job/order processing
else
#do nothing....
end
end
您所说的最小订单金额是指订单上的美元价值吗?如果是这样的话,我只会使用符合这些条件的验证。假设最低是20,你可以做
validates :amount, :numericality => { :greater_than_or_equal_to => 20, if => :is_a_deal }
private
def is_a_deal
# deal logic here. Return true/false
end