Class: Roaster::Adapters::ActiveRecord

Inherits:
Object
  • Object
show all
Defined in:
lib/roaster/adapters/active_record.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.model_class_from_resource_name(resource_name) ⇒ Object



8
9
10
# File 'lib/roaster/adapters/active_record.rb', line 8

def self.model_class_from_resource_name(resource_name)
  "#{resource_name.to_s.singularize}".classify.constantize
end

Instance Method Details

#_change_relationship(query, rel_name, rel_ids, replace: false) ⇒ Object

TODO: Please refactor me, i’m ugly



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/roaster/adapters/active_record.rb', line 24

def _change_relationship(query, rel_name, rel_ids, replace: false)
  model = model_for(query.target.resource_name)
  object = model.find(query.target.resource_ids.first)
  rel_model = rel_name.to_s.classify.constantize
  rel_meta = model.reflect_on_association(rel_name)
  rel_object = rel_model.find(rel_ids)
  case rel_meta.macro
  when :has_many
    object.send(rel_name).clear if replace === true
    object.send(rel_name).push(rel_object)
  when :belongs_to
    object.send("#{rel_name}=", rel_object)
  else
    raise "#{rel_meta.macro} relationship not implemented"
  end
  self.save(object)
end

#create_relationship(query, document) ⇒ Object

TODO: Document key isn’t always rel_name, it’s rel_name’s resource type

( not accessible here right now :-( )


45
46
47
48
49
# File 'lib/roaster/adapters/active_record.rb', line 45

def create_relationship(query, document)
  rel_name = query.target.relationship_name
  rel_ids = document[rel_name.to_s.pluralize]
  _change_relationship(query, rel_name, rel_ids)
end

#delete(query) ⇒ Object



78
79
80
81
82
# File 'lib/roaster/adapters/active_record.rb', line 78

def delete(query)
  q = scope_for(query.target)
  q.destroy_all
  q
end

#find(query, model_class: nil) ⇒ Object



57
58
59
60
# File 'lib/roaster/adapters/active_record.rb', line 57

def find(query, model_class: nil)
  raise 'No ID provided' if query.target.resource_ids.empty?
  scope_for(query.target, model_class).first
end

#new(query, model_class: nil) ⇒ Object



12
13
14
15
# File 'lib/roaster/adapters/active_record.rb', line 12

def new(query, model_class: nil)
  model = model_for(model_class || query.target.resource_name)
  model.new
end

#read(query, model_class: nil) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/roaster/adapters/active_record.rb', line 62

def read(query, model_class: nil)
  q = scope_for(query.target, model_class)
  query.includes.each do |i|
    q = q.include(i)
  end
  query.filters.each_pair do |k, v|
    q = q.where(k => v)
  end
  query.sorting.each do |resource_name, criteria|
    criteria.each do |field, direction|
      q = q.order(model_for(resource_name).arel_table[field].send(direction))
    end
  end
  q
end

#save(model) ⇒ Object

TODO: HAX, rethink data path for POST/PUT requests from the start TODO: #save! not good if we want to delay adapter request execution



19
20
21
# File 'lib/roaster/adapters/active_record.rb', line 19

def save(model)
  model.save!
end

#update_relationship(query, document) ⇒ Object



51
52
53
54
55
# File 'lib/roaster/adapters/active_record.rb', line 51

def update_relationship(query, document)
  document.each do |rel_name, rel_ids|
    _change_relationship(query, rel_name.to_sym, rel_ids, replace: true)
  end
end