Обработка заказов после достижения минимального заказа - Rails 3

В моем приложении есть сделки, в которых заказы выполняются после достижения минимальной суммы заказа. В настоящее время у меня есть установочные заказы, которые размещаются сразу после отправки заказа, и все работает.

Теперь мне нужно изменить процесс, чтобы заказы обрабатывались после достижения минимального количества заказов для сделки.

Должен ли я использовать для этого delayed_job или, может быть, процесс cron?

Вот процесс, о котором я думал.

Откладывание заказов до тех пор, пока не будет выполнен минимальный заказ

  1. Найти предложения, которые все еще активны
  2. Затем найдите сделки, в которых выполнено минимальное количество заказов.
  3. Для каждого ордера на сделку прокручивайте и обрабатывайте захват по каждому ордеру.
  4. Отправить подтверждение заказов.

Способ покупки модели моего заказа

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. Любая помощь приветствуется.


person Robert B    schedule 30.05.2011    source источник
comment
Под минимальной суммой заказа вы имеете в виду стоимость заказа в долларах? Если это так, я бы просто использовал проверку, которая соответствует этим условиям. Такие как   -  person agmcleod    schedule 30.05.2011
comment
Просто уточню, что мне нужен минимальный номер сделки, а не заказ. Таким образом, у сделки много заказов, но для того, чтобы сделка была доступна, необходимо приобрести минимальное количество.   -  person Robert B    schedule 30.05.2011


Ответы (2)


Если я правильно понимаю, в основном группа людей должна разместить заказ, прежде чем кто-то получит сделку, например, 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
person Austin Lin    schedule 30.05.2011
comment
Да, это то, что я ищу. Я собираюсь поработать над этой идеей и посмотреть, как она пойдет. Спасибо за вашу помощь. - person Robert B; 30.05.2011
comment
Я начал играть с этой идеей и задался вопросом, означает ли это, что мне нужно хранить данные кредитной карты в базе данных для последующей обработки, поскольку данные кредитной карты фиксируются в процессе заказа. - person Robert B; 07.06.2011

Под минимальной суммой заказа вы имеете в виду стоимость заказа в долларах? Если это так, я бы просто использовал проверку, которая соответствует этим условиям. Скажем, минимум 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
person agmcleod    schedule 30.05.2011