rails基于true或false语句更新属性

时间:2014-01-09 16:38:46

标签: ruby-on-rails

我已经阅读并尝试了Stackflow上很少有人在这里没有运气的建议。到目前为止我已经有了;

def save_with_payment
  if Subscription.where(:subscription_plan => "Yearly")
    update_attributes(expiry_date: Date.today.next_year)
  else
    update_attributes(expiry_date: Date.today.next_month)
  end
end

不知何故,它会将expiry_date设置为明年,即使:subscription_plan => “每月”。

2 个答案:

答案 0 :(得分:2)

这种安排完全不正确。

Subscription.where(:subscription_plan => "Yearly")在大多数情况下都是正确的,因为它适用于整个订阅模型的数据。如果其中一条记录是Yearly,那就是真的。

不是查询整个模型,而是根据用户自己的数据进行查询。

假设用户有一个订阅,那么

def save_with_payment
  subscription.yearly? ? extend_one_year : extend_one_month
end

def extend_one_year
  update_attributes(expiry_date: Date.today.next_year)
end

# def extend_one_year

或者更好的是,此类扩展逻辑应属于Subscription而不属于User。把它移到那里。还有“告诉,不要问”

class Subscription < ActiveRecord::Base
  belongs_to :user

  def next_extend_date
    next_date = subscription_plan.yearly? ? 'next_year' : 'next_month'
    Date.today.send next_date
  end
end

class User < ActiveRecord::Base
  has_one :subscription

  def save_with_payment
    extend_to subscription.next_extend_date
  end

  # But I'm not sure if such logic still need to be in Subscrption.
  def extend_to(date)
    update_attribute expiry_date: date
  end
end

答案 1 :(得分:1)

如果没有“Yearly”订阅,Subscription.where将返回空数组。

if [] #returns true

所以你的第一个条件永远是真的。请改用exists?

def save_with_payment
  if Subscription.exists?(:subscription_plan => "Yearly")
    update_attributes(expiry_date: Date.today.next_year)
  else
    update_attributes(expiry_date: Date.today.next_month)
  end
end