Class: Publication::MostRecentRevisionLookup
- Inherits:
-
Object
- Object
- Publication::MostRecentRevisionLookup
- Defined in:
- app/services/publication/most_recent_revision_lookup.rb
Overview
Service to efficiently precompute most recent revisions for a collection of publications.
This avoids N+1 queries by computing all revisions in a single database query.
Usage:
lookup = Publication::MostRecentRevisionLookup.new(publications)
most_recent_revisions = lookup.lookup_hash
most_recent = most_recent_revisions[publication.id]
Instance Attribute Summary collapse
-
#publications ⇒ Object
readonly
Returns the value of attribute publications.
Instance Method Summary collapse
-
#initialize(publications) ⇒ MostRecentRevisionLookup
constructor
A new instance of MostRecentRevisionLookup.
-
#lookup_hash ⇒ Object
Returns a hash mapping publication ID -> most recent revision (Item object) If the publication IS the most recent revision, the value will be nil to indicate "no newer revision".
Constructor Details
#initialize(publications) ⇒ MostRecentRevisionLookup
Returns a new instance of MostRecentRevisionLookup.
14 15 16 |
# File 'app/services/publication/most_recent_revision_lookup.rb', line 14 def initialize(publications) @publications = publications end |
Instance Attribute Details
#publications ⇒ Object (readonly)
Returns the value of attribute publications.
12 13 14 |
# File 'app/services/publication/most_recent_revision_lookup.rb', line 12 def publications @publications end |
Instance Method Details
#lookup_hash ⇒ Object
Returns a hash mapping publication ID -> most recent revision (Item object)
If the publication IS the most recent revision, the value will be nil to indicate "no newer revision"
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'app/services/publication/most_recent_revision_lookup.rb', line 20 def lookup_hash return {} if publications.blank? # Extract canonical SKUs from the current publications publication_ids = publications.map(&:id) canonical_skus_map = publications.to_h { |pub| [pub.id, extract_canonical_sku(pub.sku)] } # Get unique canonical SKUs unique_canonical_skus = canonical_skus_map.values.uniq # Build a single query to find the most recent revision for each canonical SKU # Using a subquery with DISTINCT ON for efficiency most_recent_by_canonical = find_most_recent_revisions(unique_canonical_skus) # Build the lookup hash result = {} publications.each do |pub| canonical_sku = canonical_skus_map[pub.id] most_recent = most_recent_by_canonical[canonical_sku] # Only return a value if there's a different, newer revision result[pub.id] = most_recent if most_recent && most_recent.id != pub.id end result end |