Encadeamento condicional de métodos

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).