【问题标题】:ActiveRecord has_one while preserving old records - Rails 5.2ActiveRecord has_one 同时保留旧记录 - Rails 5.2
【发布时间】:2018-05-18 23:35:34
【问题描述】:

我正在开发一个集成了 Stripe Billing API(使用 stripe-ruby gem)的 Rails 5.2 项目。我创建了一个Subscription 模型,还需要建立与Customer 模型的关联。

我要做的是拥有has_one :subscriptionbelongs_to :customer,这样调用customer.subscription 将返回该客户的唯一订阅对象。但是,为了保存记录,我想保留 has_one 的功能,但不知何故能够保留取消的订阅记录(即客户可能有三个以前取消的订阅记录,但调用 customer.subscription 返回 @ 987654329@ 除非最新的订阅记录仍处于“活动状态”)。

任何想法最好的方法是什么?

我能想到的一种方法是将其设置为has_many,然后设置Customer 模型方法(即:customer.subscription)以返回一条最近且活动的订阅记录。会是这样吗?

任何帮助将不胜感激!

【问题讨论】:

  • “我能想到的一种方法是将其设置为 has_many” - 我喜欢你的方式
  • 定义订阅是有效还是取消的逻辑是什么?
  • 目前,我使用的是self.subscriptions.where(status: :active).last,虽然我认为它可以改进..:status 是一个枚举值,包括:active:canceled
  • 如果是enum 它有一个范围,所以subscriptions.active.last 是一样的。

标签: ruby-on-rails ruby activerecord stripe-payments


【解决方案1】:

除了将has_many :subscriptionshas_one :active_subscription 结合使用之外,您还可以使用association extension

has_many :subscriptions do
  def current
    # logic for determining active subscription
  end
end

这样做,customer.subscriptions 将给你所有这些,而customer.subscriptions.current 将是当前的。

【讨论】:

    【解决方案2】:

    是的,对subscriptions 使用has_many 关系,然后在active_subscription 上使用has_one,在created_atcreated_at 时间戳上排序Subscription 模型。

    请注意,当您执行此操作时,您应该只使用active_subscription 来获取活动订阅,而不是设置它。只需通过has_manycustomer.subscriptions.build方法设置即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多