2009-10-21 5 views
0

Это беспокоит меня. Он не выглядит слишком сухим. Что было бы лучше? Как в стороне, почему этот ActiveRecord finder не генерирует исключение, когда запись не найдена, но .find делает?Как высушить этот фрагмент кода Ruby?

def current_account 
    return @account if @account 
    unless current_subdomain.blank? 
     @account = Account.find_by_host(current_subdomain) 
    else 
     @account = nil 
    end 
    @account 
    end 

ответ

3

Я бы закодировать это как

def current_account 
    @account ||= current_subdomain.blank? ? nil : Account.find_by_host(current_subdomain) 
end 

Что касается исключений, find_by динамические методы возвращают nil вместо того, чтобы бросать исключение. Если вы хотите исключение, используйте find с :conditions:

def current_account 
    @account ||= current_subdomain.blank? ? nil : Account.find(:first, :conditions => {:host => current_subdomain}) 
end 
0

Как насчет:

def current_account 
    @account ||= Account.find_by_host(current_subdomain) unless current_subdomain.blank? 
end 
5
def current_account 
    @account ||= current_subdomain && Account.find_by_host(current_subdomain) 
end 

Если запись не найдена, динамические find_by методы возвращают ноль, find_by_all возвращает пустой массив.

+0

+1, ваш намного лучше, чем у меня. –

+0

Но .find_by_host не следует вызывать, если current_subdomain - пустая строка. И если сбой &&, то что будет @account назначено? ложный? – Alexandre

+1

Однако это не удается, если current_subdomain равно "". "" оценивается как true в булевом контексте. Должно быть '! Current_subdomain.blank?' – EmFi

0
def current_account 
    @account ||= current_subdomain.present? && Account.find_by_host(current_subdomain) 
end 

#present? будет обрабатывать nil и пустые строки

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