2015-06-26 2 views
2

Интересно, есть ли способ, чтобы затянуть это вверх:Использование тернарного оператора Ruby? : Сократить этот

def find_by_recordtype 
    e = EvLk.find_by_sql(<SQL QUERY>) 
    return (e.size > 0 ? e : nil) 
end 

я мог бы сделать что-то вроде ниже, но предпочитают не дважды запроса.

return (EvLk.find_by_sql().size > 0 ? EvLk.find_by_sql() : nil) 

ответ

4

Вы используете find_by_sql так, вероятно вы в Rails или ActiveSupport доступны. В этом случае, вы можете использовать presence:

присутствие()

Возвращает приемник, если он присутствует в противном случае возвращает nil. object.presence эквивалентно

object.present? ? object : nil 

Таким образом, вы можете сделать это:

def find_by_recordtype 
    EvLk.find_by_sql(<SQL QUERY>).presence 
end 
+0

Да на всех предположениях, и я знал, что Рубин будет более сжатым. :-) – Scott

0

Одна вещь, которую вы можете сделать, - это меморировать результат.

Независимо от того, зависит ли это от контекста объекта и приложения.

def find_by_recordtype 
    return @records if @records 

    @records = EvLk.find_by_sql(<SQL QUERY>) 
end 

+1 для рубинового нубия.

BTW, почему вы хотите вернуть nil? Обычно для всех случаев это лучше для одного и того же типа.

+1

Не знаю, как запоминание актуально здесь –

+0

Кроме того, 'nil' можно рассматривать как«экземпляр обычного типа не является доступных на данный момент ». «Отсутствует экземпляр», в некотором смысле –

-1
EvLk.find_by_sql(<SQL QUERY>).tap{|e| break if e.empty?} 
+2

Мне не нравится этот однострочный. Слишком запутанный :) –

+0

@SergioTulentsev Скорее всего, это XY-вопрос. Это не должно быть сделано. – sawa

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