sql >> Databáze >  >> RDS >> PostgreSQL

Jak vytvořím dotaz v Ruby on Rails, který se připojí na maximum pouze ze vztahu has_many a obsahuje výběrový filtr pro tento vztah?

Poměrně jsem se potýkal se stejným problémem v aplikaci s velkým množstvím řádků a po vyzkoušení různých nových řešení, jako jsou boční spojení a poddotazy, bylo nejvýkonnějším a zdaleka nejjednodušším řešením prostě přidat cizí klíč do tabulky, který ukazuje. na nejnovější řádek a použijte zpětné volání přidružení (nebo spouštěč db ) pro nastavení cizího klíče.

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

Opravdu svítí, pokud je množství přidružených záznamů obrovské, jako tomu bylo v mém případě, protože můžete dychtivě načíst nejnovější záznam bez problémů s pamětí, ke kterým dojde, když načtete celý has_many sdružení.



  1. Proveďte alembický upgrade ve více schématech

  2. Jak mohu udělat tento geo-vzdálený SQL dotaz Postgres kompatibilní

  3. Zápis souboru pomocí více vláken

  4. Vložte malý slovník jako {1:23, 2:45, 3:17} do sloupce tabulky databáze SQL v Postgresu pomocí jazyka python