sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo construyo una consulta en Ruby on Rails que se una al máximo de una relación has_many solamente e incluya un filtro de selección en esa relación?

Luché bastante con exactamente el mismo problema en una aplicación con una gran cantidad de filas y después de probar varias soluciones novedosas como uniones laterales y subconsultas, la solución de mejor rendimiento y, con mucho, la más simple fue simplemente agregar una clave externa a la tabla que apunta a la última fila y use una devolución de llamada de asociación (o un db trigger ) para establecer la clave externa.

class AddLatestEmploymentToEmployees < ActiveRecord::Migration[6.0]
  def change
    add_reference :employees, :latest_employment, foreign_key: { to_table: :employments }
  end
end

class Employee < ActiveRecord::Base
  has_many :employments, after_add: :set_latest_employment
  belongs_to :latest_employment, 
    class_name: 'Employment',
    optional: true

  private
  def set_latest_employment(employment)
    update_column(:latest_employment_id, employment.id)
  end 
end
Employee.joins(:latest_employment)
        .where(employments: { status: :active })

Realmente brilla si la cantidad de registros asociados es enorme, como lo fue en mi caso, ya que puede cargar con entusiasmo el último registro sin los problemas de memoria que ocurren si carga todo el has_many asociación.