Sha256: 142281f44b0001dd191ab1fe1ca3914253a03ba395a7051c87cf8734a8da74e4

Contents?: true

Size: 1.79 KB

Versions: 33

Compression:

Stored size: 1.79 KB

Contents

class Graphiti::Adapters::ActiveRecord::ManyToManySideload < Graphiti::Sideload::ManyToMany
  def through_table_name
    @through_table_name ||= parent_resource_class.model
      .reflections[through.to_s].klass.table_name
  end

  def through_relationship_name
    foreign_key.keys.first
  end

  def belongs_to_many_filter(scope, value)
    if polymorphic?
      clauses = value.group_by { |v| v["type"] }.map { |group|
        ids = group[1].map { |g| g["id"] }
        filter_for(scope, ids, group[0])
      }
      scope = clauses.shift
      clauses.each { |c| scope = scope.or(c) }
      scope
    else
      filter_for(scope, value)
    end
  end

  def ids_for_parents(parents)
    if polymorphic?
      parents.group_by(&:class).map do |group|
        {id: super(group[1]), type: group[0].name}.to_json
      end
    else
      super
    end
  end

  private

  def filter_for(scope, value, type = nil)
    scope
      .includes(through_relationship_name)
      .where(belongs_to_many_clause(value, type))
  end

  def belongs_to_many_clause(value, type)
    where = {true_foreign_key => value}
    if polymorphic? && type
      where[foreign_type_column] = type
    end
    {through_table_name => where}
  end

  def foreign_type_column
    through_reflection.type
  end

  def foreign_type_value
    through_reflection.active_record.name
  end

  def polymorphic?
    !!foreign_type_column
  end

  def through_reflection
    through = parent_reflection.options[:through]
    parent_resource_class.model.reflections[through.to_s]
  end

  def parent_reflection
    parent_model = parent_resource_class.model
    parent_model.reflections[association_name.to_s]
  end

  def infer_foreign_key
    key = parent_reflection.options[:through]
    value = through_reflection.foreign_key.to_sym
    {key => value}
  end
end

Version data entries

33 entries across 33 versions & 1 rubygems

Version Path
graphiti-1.2.19 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.18 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.17 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.16 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.15 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.14 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.13 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.12 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.11 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.10 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.9 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.8 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.7 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.6 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.5 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.4 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.3 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.2 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.1 lib/graphiti/adapters/active_record/many_to_many_sideload.rb
graphiti-1.2.0 lib/graphiti/adapters/active_record/many_to_many_sideload.rb