Консультация по проектированию модели покупки (с взаимодействием Gateway) - PullRequest
0 голосов
/ 14 сентября 2011

Я делаю модель покупки, которая обрабатывает покупки на сайте, которые будут взаимодействовать с платежным шлюзом. У меня вопрос о том, как спроектировать интерфейс, нужно ли мне использовать отдельные методы класса для выполнения работы или внести исправления в жизненный цикл AR с помощью обратных вызовов.

Сначала я делал что-то вроде Purchase.make_purchase (product, ...) как метод класса. Но это не выглядело великолепно.

То, что я собираюсь реализовать, - это решение, использующее жизненный цикл модели и обратные вызовы для осуществления транзакции покупки и шлюза. Как то так:

@purchase = Purchase.new
@purchase.product = product
@purchase.user = current_user

if @purchase.save
else
end

Я бы тогда получил обратный вызов before_save, который говорит со шлюзом:

before_save :transfer_funds

, который может прервать сохранение в случае неудачи, установив @ purchase.errors [: gateway_error]

Я не уверен, что это лучший способ сделать это. Любой совет?

1 Ответ

0 голосов
/ 14 сентября 2011

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

РЕДАКТИРОВАТЬ Я понимаю, что это не ответило на вопрос, я просто думал, что это может дать вам некоторые идеи, если вы еще не использовали его.

У меня нет непосредственного опыта в обработке платежей, поэтому вы можете высказать свое мнение с большой долей соли.

Мое большое внимание при использовании методов жизненного циклав этом случае вам может понадобиться добавить дополнительную логику в ваш метод transfer_funds в этом случае, который вам может и не понадобиться.Например, если Purchase может быть обновлено позднее, вы будете вызывать свой метод transfer_funds каждый раз, когда он обновляется.

Я не уверен, что Purchase имеет концепцию предварительной авторизации, за которой следует фактический заряд, но я думаю, что transfer_funds следует вызывать только один раз?Вы можете вместо этого переместить это в before_create, но это может исправить только один этот сценарий.

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

Теперь я пытаюсь сохранить свои методы жизненного цикла в классе модели, связанные только с обновлением самой модели ActiveRecord и не делая дополнительной работы.Если хранить его в вашем контроллере невозможно, я бы подумал об использовании ActiveRecord :: Observer , чтобы абстрагировать логику, связанную с transfer_funds.

Надеюсь, это даст вам некоторые идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...