Reutilizando a lógica SQL em modelos Rails

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