sql >> Database >  >> RDS >> PostgreSQL

Hoe bouw ik een query in Ruby on Rails die alleen samenkomt op het maximum van een has_many-relatie en een select-filter voor die relatie bevat?

Ik worstelde nogal wat met exact hetzelfde probleem in een applicatie met een enorm aantal rijen en na het proberen van verschillende nieuwe oplossingen zoals laterale joins en subquery's was de best presterende en verreweg de eenvoudigste oplossing gewoon om een ​​externe sleutel toe te voegen aan de tabel die wijst naar de laatste rij en gebruik een associatie-callback (of een db-trigger ) om de externe sleutel in te stellen.

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

Het schijnt echt als het aantal gekoppelde records enorm is, zoals in mijn geval, omdat je de nieuwste record graag kunt laden zonder de geheugenproblemen die optreden als je de hele has_many laadt associatie.



  1. '<'-operator is gereserveerd PowerShell-fout

  2. Hoe importeer ik een Excel-bestand in SQL Server?

  3. CS2001 Ontbrekende AssemblyAttributes.cs bij het uitvoeren van SSIS-pakket geïmplementeerd op de server

  4. Ebean zoekt naar verkeerde volgordenaam in Play Framework 2