Class: EmptyEye::Associations::ShardAssociationScope

Inherits:
ActiveRecord::Associations::AssociationScope
  • Object
show all
Defined in:
lib/empty_eye/associations/shard_association_scope.rb

Instance Method Summary collapse

Instance Method Details

#add_constraints(scope) ⇒ Object



11
12
13
14
15
16
17
18
19
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/empty_eye/associations/shard_association_scope.rb', line 11

def add_constraints(scope)
  tables = construct_tables

  chain.each_with_index do |reflection, i|
    table, foreign_table = tables.shift, tables.first

    if reflection.source_macro == :has_and_belongs_to_many
      join_table = tables.shift

      scope = scope.joins(join(
        join_table,
        table[reflection.association_primary_key].
          eq(join_table[reflection.association_foreign_key])
      ))

      table, foreign_table = join_table, tables.first
    end

    if reflection.source_macro == :belongs_to
      if reflection.options[:polymorphic]
        key = reflection.association_primary_key(klass)
      else
        key = reflection.association_primary_key
      end

      foreign_key = reflection.foreign_key
    else
      key         = reflection.foreign_key
      foreign_key = reflection.active_record_primary_key
    end

    conditions = self.conditions[i]

    if reflection == chain.last
      scope = scope.where(table[key].eq(owner[foreign_key]))

      if reflection.type
        scope = scope.where(table[reflection.type].eq(owner.master_class.base_class.name))
      end

      conditions.each do |condition|
        if options[:through] && condition.is_a?(Hash)
          condition = { table.name => condition }
        end

        scope = scope.where(interpolate(condition))
      end
    else
      constraint = table[key].eq(foreign_table[foreign_key])

      if reflection.type
        type = chain[i + 1].klass.base_class.name
        constraint = constraint.and(table[reflection.type].eq(type))
      end

      scope = scope.joins(join(foreign_table, constraint))

      unless conditions.empty?
        scope = scope.where(sanitize(conditions, table))
      end
    end
  end

  scope
end