【问题标题】:Rails booking feature with Payment Gateway带有支付网关的 Rails 预订功能
【发布时间】:2020-05-27 11:59:05
【问题描述】:

这里是 Rails 后端开发新手。第一次尝试集成支付网关。希望我能设法解释一切。

我正在使用支付网关 Mangopay 构建一个预订市场平台(我的请求不需要了解这项技术)

所以,从我想象的预订过程来看,我有这两个模型:

Bookings

# Schema
create_table "bookings", force: :cascade do |t|
  t.bigint "booking_transaction_id", null: false
  ...
end

# Model
class Booking < ApplicationRecord
  belongs_to :user
  has_one :booking_transaction
  ...
end

Booking_transactions(负责预订和支付网关之间的所有逻辑)

# Schema
create_table "booking_transactions", force: :cascade do |t|
  t.bigint "booking_id", null: false
  ...
end

# Model
class BookingTransaction < ApplicationRecord
  belongs_to :booking
  ...
end

然后我有一个控制器,我想在其中创建一个booking。但是预订需要booking_transaction 对吗?我开始在我的控制器中写这样的东西:

def create
  booking = current_user.bookings.create!(

  )
end

当然,我会收到NotNullViolation,因为创建预订需要booking_transaction_id。所以我不确定这个过程应该是什么样子。

提前感谢您提供的任何帮助。

【问题讨论】:

  • 不能有两张桌子这样互相要求,为什么Booking一定要有booking_transaction_id
  • 昨天意识到了这一点。修复了我的问题。我会发布一个解决方案。谢谢

标签: ruby-on-rails activerecord mangopay


【解决方案1】:

事实证明,我不应该让 2 个模型相互要求。

我从booking 模型中删除了booking_transaction 引用(即booking_transaction_id)。

现在可以像这样创建预订:

def create
  transaction = BookingTransaction.new

  booking = current_user.bookings.create!(
    transaction: transaction
    ...
  )
end

这将创建一个 booking_transaction 并将其附加到新创建的 booking 实例上,这要归功于 Rails Way。

【讨论】:

    猜你喜欢
    • 2016-05-19
    • 2016-06-16
    • 2015-11-12
    • 2021-08-28
    • 2020-03-06
    • 2016-08-02
    • 1970-01-01
    • 2014-12-12
    • 2013-05-12
    相关资源
    最近更新 更多