Quick tip: write database queries with Arel

products = Product.arel_table
orders = Order.arel_table

average_purchase_time = Arel::Nodes::Case.new.when(orders[:finished_at].not_eq(nil))
                                         .then(orders[:finished_at] - orders[:created_at])

purchased = Arel::Nodes::Case.new.when(orders[:finished_at].not_eq(nil))
                             .then(1).else(0)

statement = products
            .outer_join(orders)
            .on(orders[:product_id].eq(products[:id]))
            .project(products[:id].count(true).as('total'))
            .project(purchased.sum.as('purchased'))
            .project(average_purchase_time.average.as('average_purchase_time'))

Product.find_by_sql(statement.to_sql)

Explaining:

products = Product.arel_table
orders = Order.arel_table

When you call arel_table for an ActiveRecord class, this will return an Arel::Table object.

average_purchase_time = Arel::Nodes::Case.new.when(orders[:finished_at].not_eq(nil))
                                         .then(orders[:finished_at] - orders[:created_at])

purchased = Arel::Nodes::Case.new.when(orders[:finished_at].not_eq(nil))
                             .then(1).else(0)

With Arel::Nodes::Case, you can create an object that generates a CASE expression.

The method outer_join is used to left join a table, that returns an Arel::SelectManager object. Please remember to call the method on with the ON clause.

Read more

Que conselho você daria para alguém que acabou de se tornar gerente de engenharia (times de desenvolvimento de software)?

O William Oliveira fez esse tweet aqui:

E eu respondi:

No final do dia, as pessoas são tudo

Tudo vai girar em torno delas. A partir desse momento, você vai ter que lidar com Pessoas Engenheiras de Software, e com isso, todos os desafios de comunicação que podem acontecer:

  • Frases mal colocadas e mal interpretadas;
  • frustrações salarias não resolvidas;
  • expectativas não atendidas;
  • ansiedades por novas oportunidades não endereçadas;

E essa lista é imensa. A partir do momento que você é responsável por um ou mais times de engenharia, é esse tipo de problema que você vai ter que resolver. Esse é seu novo trabalho e, para isso, poucos lugares/literatura vão te ajudar, mas existe uma em especial que adoro recomendar: The Manager’s Path: A Guide for Tech Leaders Navigating Growth and Change.

Read more