Suponha que você tenha o seguinte escopo nomeado:
class
Escopo da tarefa : ativo, -> {where (“LOTS OF LOGS OF FUNKY SQL”)}
end
e você também deseja ter #active? atributo na instância do modelo, talvez para estilização.
É claro que você poderia reimplementar “MUITOS LOGS OF FUNKY SQL” no Ruby, mas é muito sujeito a erros para lógica complexa.
Em vez disso, você pode adicionar um atributo “virtual”:
scope :with_active_attribute, ->{
subquery = active.select('tasks.id, true AS active').to_sql
joins("LEFT JOIN (#{subquery}) AS tasks_active ON tasks_active.id = tasks.id").select('tasks.*, tasks_active.active AS active')
}
Agora, todas as instâncias de Task carregadas com o atributo ativo terão um atributo ‘ativo’ extra disponível:
Task.with_active_attribute.first.active? # true/false
“Nem sempre empurro a lógica para o banco de dados, mas quando o faço, reutilizo-a nos modelos.”