sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan bygger jeg en forespørgsel i Ruby on Rails, der kun forbindes på maks. af en has_many-relation og inkluderer et udvalgt filter på denne relation?

Jeg kæmpede en del med nøjagtig det samme problem i en applikation med en enorm mængde rækker, og efter at have prøvet forskellige nye løsninger som laterale sammenføjninger og underforespørgsler var den bedst ydende og langt enkleste løsning bare at tilføje en fremmednøgle til tabellen, der peger til den seneste række og brug et tilknytningsopkald (eller en db-trigger ) for at indstille fremmednøglen.

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

Det skinner virkelig, hvis mængden af ​​tilknyttede poster er enorm, som det var i mit tilfælde, da du ivrig kan indlæse den seneste post uden de hukommelsesproblemer, der opstår, hvis du indlæser hele has_many forening.



  1. Kopier to kolonner fra en tabel til en anden, men kun unikke værdier

  2. MySQL LAST_INSERT_ID() brugt med flere poster INSERT-sætning

  3. Hvordan kan jeg hente forekomst af sidst tilføjede element

  4. Hvordan man fortæller, hvornår en Postgres-tabel blev grupperet, og hvilke indekser der blev brugt