44 lines
886 B
Ruby
44 lines
886 B
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module GemExtensions
|
||
|
module ActiveRecord
|
||
|
module DisableJoins
|
||
|
class Relation < ::ActiveRecord::Relation
|
||
|
attr_reader :ids, :key
|
||
|
|
||
|
def initialize(klass, key, ids)
|
||
|
@ids = ids.uniq
|
||
|
@key = key
|
||
|
super(klass)
|
||
|
end
|
||
|
|
||
|
def limit(value)
|
||
|
records.take(value) # rubocop:disable CodeReuse/ActiveRecord
|
||
|
end
|
||
|
|
||
|
def first(limit = nil)
|
||
|
if limit
|
||
|
records.limit(limit).first
|
||
|
else
|
||
|
records.first
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def load
|
||
|
super
|
||
|
records = @records
|
||
|
|
||
|
records_by_id = records.group_by do |record|
|
||
|
record[key]
|
||
|
end
|
||
|
|
||
|
records = ids.flat_map { |id| records_by_id[id.to_i] }
|
||
|
records.compact!
|
||
|
|
||
|
@records = records
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|