Module: NinjaModel::SpawnMethods

Included in:
Relation
Defined in:
lib/ninja_model/relation/spawn_methods.rb

Constant Summary collapse

VALID_FIND_OPTIONS =
[:conditions, :limit, :offset, :order]

Instance Method Summary collapse

Instance Method Details

#apply_finder_options(options) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/ninja_model/relation/spawn_methods.rb', line 43

def apply_finder_options(options)
  relation = clone
  return relation unless options

  options.assert_valid_keys(VALID_FIND_OPTIONS)
  finders = options.dup
  finders.delete_if { |key, value| value.nil? }

  ([:order, :limit, :offset] & finders.keys).each do |finder|
    relation = relation.send(finder, finders[finder])
  end

  relation = relation.where(finders[:conditions]) if options.key?(:conditions)
  relation
end

#merge(r) ⇒ Object



6
7
8
9
10
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
# File 'lib/ninja_model/relation/spawn_methods.rb', line 6

def merge(r)
  merged_relation = clone
  return merged_relation unless r
  return to_a & r if r.is_a?(Array)

  order_value = r.ordering
  if order_value.present?
    merged_relation.ordering = merged_relation.ordering + order_value
  end

  merged_predicates = @predicates + r.predicates

  unless @predicates.empty?
    seen = []
    merged_predicates = merged_predicates.reverse.reject { |w|
      nuke = false
      if w.respond_to?(:operator) && w.operator == :==
        attribute = w.attribute
        nuke = seen[attribute]
        seen[attribute] = true
      end
      nuke
    }.reverse
  end
  merged_relation.predicates = merged_predicates

  Relation::SINGLE_VALUE_ATTRS.each do |method|
    value = r.send(:"#{method}_value")
    merged_relation.send(:"#{method}_value=", value) unless value.nil?
  end

  merged_relation

end