如何从Rails中的update_attributes中排除空值

时间:2014-11-09 02:35:32

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

我正在尝试处理Invoice.created的Stripe Webhook,并希望保存发票行项目。我的挑战是文件变量根据订单项类型而变化。

我尝试导入订单项时收到undefined method 'name' for nil:NilClass,因为根据订单项的类型,计划对象可能为空。

我能够通过将update_attributes分成2来解决问题,只有在计划对象存在时才会发生这种情况。以下是我开始工作的内容。我希望有更好的方法。

  @invoice_line_item = InvoiceLineItem.where(stripe_line_item_id: line_item.id).first_or_create(invoice_id: @invoice.id)
  @invoice_line_item.update_attributes(
    amount: line_item.amount,
    currency: line_item.currency,
    period_start: Time.at(line_item.period.start).strftime("%m-%d-%Y"),
    period_end: Time.at(line_item.period.end).strftime("%m-%d-%Y"),
    proration: line_item.proration,
    item_type: line_item.type)
  if line_item.plan.present?
    @invoice_line_item.update_attributes(
      plan_name: line_item.plan.name,
      plan_interval: line_item.plan.interval,
      plan_amount: line_item.plan.amount,
      trial_period_days: line_item.plan.trial_period_days)
  end 

1 个答案:

答案 0 :(得分:0)

你可以尝试

line_item.plan.try(:name)

以及所有line_item.plan元素

的类似内容

如果主题为http://apidock.com/rails/Object/try

,尝试(在rails中)会给你nil

它并没有真正排除零值,但如果line_item.plan为零,则子值也将为nil。如果这是正确的行为,那么您应该尝试try

更新:我今天早上点击了这篇coderwall帖子(https://coderwall.com/p/wamyow),提到delegateallow_nil: true一起使用。你能做点什么吗

class InvoiceLineItem < ActiveRecord::Base

  delegate :name, :interval, :amount, :trial_period_days, to: :plan, allow_nil: true

  ... rest of the class ...

end

然后仔细观察,我想知道为什么如果通过这种关系可以更新plan上的所有line_item属性?我错过了什么吗?