我已经阅读并尝试了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 => “每月”。
答案 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