2014-02-06 2 views
0

Я сделал класс с этими методами:Predicate синтаксис

def promotion_available? 
    promotion.present? 
end 

def promotion 
    @promotion ||= PromotionUser.user(@user.id).available.first 
end 

Затем, коллега удалил метод promotion и изменил предикат promotion_available? таким образом:

def promotion_available? 
    @promotion ||= PromotionUser.user(@user.id).available.first 
end 
  • Могу ли я установить переменную экземпляра непосредственно по методу предикатов?
  • Может ли предикатный метод возвращать целый объект вместо true/false (думаю, нет, но мой коллега говорит наоборот)?
+1

@sawa: [sic]? Нет, это не sic, это, очевидно, опечатка :) –

ответ

3

Могу ли я установить переменную экземпляра непосредственно на метод предиката?

Да, в этом нет ничего плохого. Я делаю это часто.

Может ли метод предикат возвращает весь объект вместо Тре/ложь (я думаю, что нет, но мой коллега говорит об обратном)

Да, это является обычным явлением. Но он работает, только если вы используете идиоматические проверки прав на рубины.

if obj.promotion_available? # GOOD 
if obj.promotion_available? == true # BAD! 

Помните, что только nil и false в рубина falsey значения. Все остальное верно. Вот почему возвращение объекта или nil работает как возвращение true или false.

+0

Вопрос не ясен, на каком уровне он спрашивает: речь идет о синтаксической правильности или о согласии. Ваш ответ вроде наследует эту двусмысленность. Но, +1. – sawa

1

Хотя изменение «работает», он вводит побочный эффект: вы должны вызвать promotion_available?, прежде чем вы можете использовать promotion (при условии, что существует promotion метод):

your_object.promotion    #=> nil 

your_object.promotion_available? 
your_object.promotion    #=> <#PromotionUser ...> 

Вы оригинальный код Безразлично У меня есть эта зависимость.

ИМО было бы более интуитивным, чтобы сохранить метод promotion и удалить promotion_available?. Вы могли бы просто написать:

if obj.promotion 
    # with promotion 
else 
    # without promotion 
end 
+0

Метод 'promotion' был удален, поэтому ему, вероятно, не нужно его использовать. :) –

+0

@SergioTulentsev, если он не определен неявно, например. через 'attr_accessor' – Stefan

+0

Да, #promotion больше не существует, вместо него мы вызываем @promotion, определенную на #promotion_available? – mirco