PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment créer une requête dans Ruby on Rails qui se joint au maximum d'une relation has_many uniquement et inclut un filtre de sélection sur cette relation ?

J'ai eu un peu de mal avec exactement le même problème dans une application avec une énorme quantité de lignes et après avoir essayé diverses nouvelles solutions comme les jointures latérales et les sous-requêtes, la solution la plus performante et de loin la plus simple consistait simplement à ajouter une clé étrangère à la table qui pointe à la dernière ligne et utilisez un rappel d'association (ou un déclencheur db ) pour définir la clé étrangère.

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

Cela brille vraiment si la quantité d'enregistrements associés est énorme, comme c'était le cas dans mon cas, car vous pouvez charger avec impatience le dernier enregistrement sans les problèmes de mémoire qui se produisent si vous chargez l'intégralité de has_many association.