2014-01-09 3 views
0

Я читал и пробовал все, что мало кто из 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

Объясните мне логику вашего приложения. Теперь он говорит: Если есть какие-либо годовые подписки, установите expiry_date equal next_year –

ответ

1

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 
+0

Возможно, я ошибаюсь, но OP не должен проверять 'subscription.subscription_plan == 'Yearly'' вместо' Subscription.where (: subscription_plan => 'Годовой') '? так как это метод экземпляра. – vee

+0

vee doing subscription.subscription_plan == 'yearly' Я получаю subscription_plan не определен по какой-то странной причине. Возможно, я ошибаюсь. – user2419316

+0

Спасибо, Vimsha, .exists? был тем, что я искал. – user2419316

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 

Или еще лучше, такой простирающуюся логика должна принадлежит Подписка а не пользователя. Переместите его туда. А также «Расскажите, не спрашивайте»

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 
+0

Проголосуйте это, так как я также думаю, что это то, что должен делать OP! – vee

+1

@vee, спасибо за поддержку и приятно иметь с вами такое же мнение! –

+0

Привет, Билли, спасибо за советы, я не пытаюсь продлить подписку, а задаю соответствующий expiry_date на основе того, что выбирает пользователь. Поэтому я знаю, что мой вопрос был грязным, но я пытался установить другой атрибут, основанный на логике того, что имеет столбец: subscription_plan, каждый год или ежемесячно. Если это имеет смысл. – user2419316

Смежные вопросы