rails 4 activerecord更新多个属性

时间:2014-05-07 17:11:51

标签: ruby-on-rails ruby activerecord ruby-on-rails-4

我对尝试使用Rails 4 / Activerecord进行的更新感到困惑。我正在使用的应用程序是使用Stripe来处理订阅,这个函数应该处理更新的订阅(条带customer.subscription.updated事件):

# passing in a stripe webhook event object
# event.data.object.current_period_end = 1402100302
subscription = Subscription.find_by(stripe_id: event.data.object.id)
plan = Plan.find_by(stripe_name: event.data.object.plan.id)

subscription.update(expires_at: event.data.object.current_period_end, plan_id: plan.id)

这一切看起来很清楚,当我在rails控制台中执行各行时,我会获得subscriptionplan等的有效数据。但是,update不会按预期工作。以下是rails控制台中执行的查询显示的update行:

SQL (0.7ms)  UPDATE "subscriptions" SET "expires_at" = $1, "updated_at" = $2 WHERE "subscriptions"."id" = 23  [["expires_at", nil], ["updated_at", Wed, 07 May 2014 17:09:25 UTC +00:00]]
   (15.9ms)  COMMIT
=> true

expires_atnil,第二个值plan.id甚至不会传递给查询。我该如何处理此更新?

1 个答案:

答案 0 :(得分:2)

看起来event.data.object.current_period_end只需要像这样转换为Time

subscription.update(expires_at: Time.at(event.data.object.current_period_end), plan_id: plan.id)

这很令人困惑,因为在create_subscription事件中我更新完全相同,通过webhook数据设置expires_at,并使用相同的值/时间戳来设置expires_at值。

看起来rails也足够智能,可以知道update何时不会更改某个值 - 因此它会使其脱离查询。这是我与plan_id混淆的一部分 - expires_at日期已经改变,但计划没有 - 所以rails将更新语句的那部分从sql中删除。