Problema
Tenho visto o seguinte padrão repetidamente:
institution_users =
if params[:is_internal]
User.
for_institution(some_id).
only_name_and_email.
internal_only
else
User.
for_institution(some_id).
only_name_and_email.
external_only
end
É bastante ilegível porque você acaba lendo o mesmo código duas vezes, imaginando se há alguma diferença entre cadeias de métodos …
Solução
Em vez disso, considere o seguinte:
users_for_institution = lambda {
User.
for_institution(some_id).
only_name_and_email
}
institution_users =
if params[:is_internal]
users_for_institution.call.internal_only
else
users_for_institution.call.external_only
end
Claro, você também pode aninhar mais cadeias de métodos:
users_for_institution = lambda { |some_id|
User.
for_institution(some_id).
only_name_and_email
}
internal_users = lambda {
users_for_institution.
call(123).
internal_only
}
internal_users.call.sorted # only one DB query
Conclusão
A técnica apresentada é bastante básica.
Às vezes, torna o código mais eficiente (evita atingir o banco de dados várias vezes).
O maior benefício que vejo aqui é que ele remove a duplicação de código desnecessária (DRY).