sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur bygger jag en fråga i Ruby on Rails som bara går med på max av en has_many-relation och inkluderar ett urvalsfilter på den relationen?

Jag kämpade ganska mycket med exakt samma problem i en applikation med en enorm mängd rader och efter att ha provat olika nya lösningar som laterala sammanfogningar och subqueries var den bästa och absolut enklaste lösningen bara att lägga till en främmande nyckel i tabellen som pekar till den senaste raden och använd en associationsuppringning (eller en db-utlösare ) för att ställa in den främmande nyckeln.

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 lyser verkligen om mängden associerade poster är enorma som det var i mitt fall eftersom du gärna kan ladda den senaste posten utan minnesproblemen som uppstår om du laddar hela has_many förening.



  1. Apostrof och kolon i vackra länkar

  2. Hur man skickar NEW.* till EXECUTE i triggerfunktionen

  3. Viloläge på Oracle:mappa String-egenskapen till CLOB-kolumnen

  4. får fel HTTP Status 405 - HTTP-metoden GET stöds inte av den här webbadressen men används aldrig "get"?