diff options
Diffstat (limited to 'lib/gem_extensions/active_record/disable_joins/relation.rb')
-rw-r--r-- | lib/gem_extensions/active_record/disable_joins/relation.rb | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/lib/gem_extensions/active_record/disable_joins/relation.rb b/lib/gem_extensions/active_record/disable_joins/relation.rb new file mode 100644 index 00000000000..01eb6381a85 --- /dev/null +++ b/lib/gem_extensions/active_record/disable_joins/relation.rb @@ -0,0 +1,43 @@ +# 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 |