PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie erstelle ich eine Abfrage in Ruby on Rails, die nur am Maximum einer has_many-Beziehung teilnimmt und einen Auswahlfilter für diese Beziehung enthält?

Ich hatte ziemlich viel mit genau demselben Problem in einer Anwendung mit einer großen Anzahl von Zeilen zu kämpfen, und nachdem ich verschiedene neuartige Lösungen wie laterale Joins und Unterabfragen ausprobiert hatte, bestand die leistungsstärkste und bei weitem einfachste Lösung darin, der Tabelle einen Fremdschlüssel hinzuzufügen, der zeigt in die letzte Zeile und verwenden Sie einen Assoziations-Callback (oder einen DB-Trigger ), um den Fremdschlüssel festzulegen.

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

Es glänzt wirklich, wenn die Menge der verknüpften Datensätze so groß ist wie in meinem Fall, da Sie eifrig den neuesten Datensatz laden können, ohne die Speicherprobleme, die auftreten, wenn Sie den gesamten has_many laden Verein.