Class: MotionPrime::AssociationCollection

Inherits:
Array
  • Object
show all
Defined in:
motion-prime/models/association_collection.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(bag, options, *args) ⇒ AssociationCollection

Returns a new instance of AssociationCollection.



8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'motion-prime/models/association_collection.rb', line 8

def initialize(bag, options, *args)
  @bag = bag
  @association_name = options[:association_name]
  bag.bare_class = model_class

  inverse_relation_options = options[:inverse_relation]
  define_inverse_relation(inverse_relation_options)

  @model_inverse_relation_name = (model_class._associations || {}).find do |name, options|
    options[:class_name] == inverse_relation.class_name_without_kvo
  end.try(:first)

  super all(*args)
end

Instance Attribute Details

#association_nameObject (readonly)

Returns the value of attribute association_name.



3
4
5
# File 'motion-prime/models/association_collection.rb', line 3

def association_name
  @association_name
end

#bagObject (readonly)

Returns the value of attribute bag.



3
4
5
# File 'motion-prime/models/association_collection.rb', line 3

def bag
  @bag
end

#inverse_relation_keyObject (readonly)

Returns the value of attribute inverse_relation_key.



4
5
6
# File 'motion-prime/models/association_collection.rb', line 4

def inverse_relation_key
  @inverse_relation_key
end

#inverse_relation_nameObject (readonly)

Returns the value of attribute inverse_relation_name.



4
5
6
# File 'motion-prime/models/association_collection.rb', line 4

def inverse_relation_name
  @inverse_relation_name
end

#model_inverse_relation_nameObject (readonly)

Returns the value of attribute model_inverse_relation_name.



4
5
6
# File 'motion-prime/models/association_collection.rb', line 4

def model_inverse_relation_name
  @model_inverse_relation_name
end

Instance Method Details

#all(*args) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
# File 'motion-prime/models/association_collection.rb', line 42

def all(*args)
  return [] unless bag.store.present?
  find_options = find_options(args[0])
  sort_options = sort_options(args[1])
  data = if sort_options.present? # TODO: check bag items count
    bag.find(find_options, sort_options)
  else
    bag.to_a.select { |entity| find_options.all? { |field, value| entity.send(field) == value } }
  end
  set_inverse_relation_for(data)
  data
end

#define_inverse_relation(options) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
# File 'motion-prime/models/association_collection.rb', line 29

def define_inverse_relation(options)
  # TODO: handle different relation types (habtm, has_one...)
  @inverse_relation_name = name = options[:name].to_sym
  self.class_eval do
    define_method name do
      options[:instance]
    end
    alias_method :inverse_relation, name
  end

  @inverse_relation_key = inverse_relation._associations[association_name][:foreign_key].try(:to_sym)
end

#delete_allObject



79
80
81
# File 'motion-prime/models/association_collection.rb', line 79

def delete_all
  all.each { |obj| obj.delete }
end

#find_options(options) ⇒ Object



61
62
63
64
65
66
67
68
69
# File 'motion-prime/models/association_collection.rb', line 61

def find_options(options)
  options ||= {}
  options.merge!(bag_key: bag.key)
  if inverse_relation_key.present?
    {inverse_relation_key => inverse_relation.id}.merge options
  else
    options
  end
end

#model_classObject



75
76
77
# File 'motion-prime/models/association_collection.rb', line 75

def model_class
  @model_class ||= @association_name.classify.constantize
end

#new(attributes = {}) ⇒ Object



23
24
25
26
27
# File 'motion-prime/models/association_collection.rb', line 23

def new(attributes = {})
  model_class.new(attributes).tap do |model|
    set_inverse_relation_for(model)
  end
end

#set_inverse_relation_for(models) ⇒ Object



55
56
57
58
59
# File 'motion-prime/models/association_collection.rb', line 55

def set_inverse_relation_for(models)
  [*models].each do |model|
    model.send("#{inverse_relation_name}=", inverse_relation)
  end if model_inverse_relation_name.present?
end

#sort_options(options) ⇒ Object



71
72
73
# File 'motion-prime/models/association_collection.rb', line 71

def sort_options(options)
  options || {sort: model_class.default_sort_options}
end