PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zbudować zapytanie w Ruby on Rails, które łączy się na maksimum relacji has_many i zawiera filtr wyboru dla tej relacji?

Trochę zmagałem się z dokładnie tym samym problemem w aplikacji z ogromną liczbą wierszy i po wypróbowaniu różnych nowatorskich rozwiązań, takich jak łączenia boczne i podzapytania, najlepszym i zdecydowanie najprostszym rozwiązaniem było dodanie klucza obcego do tabeli, który wskazuje do ostatniego wiersza i użyj wywołania zwrotnego asocjacji (lub wyzwalacz db ), aby ustawić klucz obcy.

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

Naprawdę błyszczy, jeśli ilość powiązanych rekordów jest tak duża, jak w moim przypadku, ponieważ możesz szybko załadować najnowszy rekord bez problemów z pamięcią, które występują, jeśli załadujesz cały has_many stowarzyszenie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak korzystać z dj-database-url podczas łączenia się z postgresql w heroku za pomocą pythona?

  2. Ograniczenie NOT NULL na zbiorze kolumn

  3. Wstaw ramkę danych do postgresql sqlalchemy z autoinkrementacją idx

  4. Jak włączyć logowanie powolnych zapytań w PostgreSQL?

  5. Samozarządzające tablice partycji PostgreSQL