Rails - 创建单独的表或绕过所有模型验证?

时间:2011-08-22 22:47:31

标签: ruby-on-rails model

我目前正在使用带有rails的wepay。不要担心这篇文章与wepay无关。

  1. 因此,当客户想要从我的网站购买商品时,他/她将被重定向到wepay。
  2. 然后,在支付wepay后,wepay会将用户重定向到/ purchase / received
  3. 经过X段时间后,Wepay还会打电话/购买/回电告诉我付款已被捕获(信用卡处理速度慢)
  4. 所以我原来的计划如下:

    1. 对于Purchase模型,有一个字段wepay_id和wepay_confirmed。
    2. 当用户在wepay上下订单时,重定向到/ puchases / received会创建一个购买实例并保存在我的数据库中
    3. 调用回调时,请通过wepay_id查找,然后将wepay_confirmed设置为true。
    4. 然而,正如我发现X时间可能如此之快以至于/ purchase / received之前调用/ purchase / callback可以创建对象。

      所以现在我有两个选择:

      1. 允许/购买/回调以仅使用id并且确认= true创建一个空的Purchase实例。当我这样做时,我意识到我不再能够以传统方式验证我的模型。这真让我烦恼。
      2. 创建一个名为Wepay_Confirmed的单独表。每当调用回调时,在wepay_confirmed中创建一个条目。将此表中(checkout_id)的存在映射到Purchase.confirmed属性。
      3. 我正在考虑做2.我该怎么做?我是否必须为特定模型生成支架以映射到Wepay_Confirmed?

        如果您有任何其他建议,请回复

4 个答案:

答案 0 :(得分:2)

我会尽量保持你的应用程序的存在,因为它确实有意义,但是你应该考虑将一个错误代码返回到wepay并让它们在创建记录之后提交请求。

只需通过电子邮件发送给WePay的开发人员并得到了回复:

  

嗨德文,<​​/ p>      

我们有自动IPN重试。重试发生在5分钟后   初始尝试,如果重试不起作用,我们尝试15分钟后,和   然后一小时后。但是,现在它们只是空404   响应。

     

最好的解决方案是,如果他不这样做,实际上就是忽略IPN   在他的数据库中有记录。我们的IPN只告诉应用程序   使用/ checkout调用查找结帐详细信息。他们没有   结帐的任何细节。因为他应该抬头看看   / checkout状态无论如何,当他在他的创建结帐对象时   最后,他不需要IPN告诉他在这里查看状态   情况下。

     

如果这对他不起作用,他也可以发送电子邮件至api@wepay.com   我们或许可以找到解决方案。

     

安德鲁

所以看起来您可以修改应用程序的流程以忽略没有记录的IPN并手动检查,或者您可以用404响应,他们将在上述时间间隔重试。

答案 1 :(得分:1)

正如我在评论中提到的,我个人更愿意在购买时创建购买记录,然后将用户发送到WePay网站,然后处理回程和回调,作为针对原始购买网站完成的操作。< / p>

首先,它更准确地符合交易的实际情况。当用户从您的网站购买产品时,我觉得这是您应该坚持的事情。

WePay交易的两个要素(您的网站回程和收费确认回调)都将对原始购买记录采取行动。这还可以让您了解有多少人在点击WePay时放弃了购买流程,这可能会在您的用户体验中发现可能有助于最大限度地提高转化次数的问题。

答案 2 :(得分:1)

我创建了一个名为wepay-rails的宝石,可以为你处理所有这些。在将付款人发送给wepay之前,它会创建条目(WepayCheckoutRecord)。它内置了一个IPN侦听器,用于处理该记录的更新。在我的个人rails应用程序中,我在WepayCheckoutRecord模型上使用状态机来跟踪状态的变化,并在状态发生变化时执行“事情”。

我希望有所帮助。

亚当 -

答案 3 :(得分:0)

如果你采取第二种方法,你不需要支架。您可以创建一个迁移并在其他“支架”中使用它。脚手架实际上只是开始使用资源的一种方式。我不认为你的意图是拥有一个完全成熟的资源。除非是,否则你可以将它用作脚手架。