2013-08-16 4 views
3

Есть ли более идиоматический способ для меня, чтобы вернуть булев в #survey_completed? Это, как я делал вещи в C#, и я всегда чувствовал, что последний троичного пункта для возврата false является излишним, так что, возможно, у Руби есть лучший способ сделать это?Рубин идиоматический способ вернуть булевы

Так что мой код в настоящее время выглядит следующим образом:

def survey_completed? 
    self.survey_completed_at ? true: false 
    end 

    def survey_completed_at 
    # Seeing as the survey is submitted all or nothing, the time the last response is persisted 
    # is when the survey is completed 
    last_response = self.responses.last 
    if last_response 
     last_response.created_at 
    end 
    end 

ответ

5

Вы можете использовать двойное отрицание:

def survey_completed? 
    !!survey_completed_at 
end 
+0

Это именно то, что я ищу – Lee

+0

в целом, будьте осторожны с '!!', если ваш ввод является строкой, так как он вернет true для пустой строки и это может быть желательным. Только FYI –

+0

@IuriG. в этом случае активна поддержка «Object # present?». –

2
def survey_completed? 
    !survey_completed_at.nil? 
    end 
+1

Вам не нужно 'self', поэтому я отредактировал .. :) * + 1 * ... –

+2

Это вернет' true', если 'survey_completed_at' является' false', что может или не ожидается. –

+1

survey_completed_at - поле даты и времени – Lee

0

идиоматических способ сделать это в Ruby, чтобы не делать , Каждый объект, за исключением false и nil, оценивает значение true в булевом контексте. Таким образом, ваша функция survey_completed_at уже служит функции survey_completed?.

Если у вас есть ответ на опрос, то last_response.created_at будет чем-то не нулевым, поэтому функция будет оценивать значение true в булевом контексте. Если вы не получили ответа, а last_response - nil, значение if будет оцениваться до nil, и функция будет оцениваться до false в булевом контексте.

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