Class: JsonapiCompliable::Adapters::ActiveRecord

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

Overview

See Also:

Instance Method Summary collapse

Instance Method Details

#associate(parent, child, association_name, association_type) ⇒ Object

When a has_many relationship, we need to avoid Activerecord implicitly firing a query. Otherwise, simple assignment will do



74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/jsonapi_compliable/adapters/active_record.rb', line 74

def associate(parent, child, association_name, association_type)
  if association_type == :has_many
    associate_many(parent, child, association_name)
  elsif association_type == :habtm
    if parent.send(association_name).exists?(child.id)
      associate_many(parent, child, association_name)
    else
      parent.send(association_name) << child
    end
  elsif
    child.send("#{association_name}=", parent)
  end
end

#average(scope, attr) ⇒ Float

Returns the average of the scope.

Examples:

ActiveRecord default

def average(scope, attr)
  scope.average(attr).to_f
end


32
33
34
# File 'lib/jsonapi_compliable/adapters/active_record.rb', line 32

def average(scope, attr)
  scope.average(attr).to_f
end

#count(scope, attr) ⇒ Numeric

Returns the count of the scope.

Examples:

ActiveRecord default

def count(scope, attr)
  column = attr == :total ? :all : attr
  scope.uniq.count(column)
end


23
24
25
26
27
28
29
# File 'lib/jsonapi_compliable/adapters/active_record.rb', line 23

def count(scope, attr)
  if attr.to_sym == :total
    scope.distinct.count
  else
    scope.distinct.count(attr)
  end
end

#create(model_class, create_params) ⇒ Object

Returns the model instance just created.

Examples:

ActiveRecord default

def create(model_class, create_params)
  instance = model_class.new(create_params)
  instance.save
  instance
end

See Also:



100
101
102
103
104
# File 'lib/jsonapi_compliable/adapters/active_record.rb', line 100

def create(model_class, create_params)
  instance = model_class.new(create_params)
  instance.save
  instance
end

#destroy(model_class, id) ⇒ Object

Returns the model instance just destroyed.

Examples:

ActiveRecord default

def destroy(model_class, id)
  instance = model_class.find(id)
  instance.destroy
  instance
end

See Also:



114
115
116
117
118
# File 'lib/jsonapi_compliable/adapters/active_record.rb', line 114

def destroy(model_class, id)
  instance = model_class.find(id)
  instance.destroy
  instance
end

#disassociate(parent, child, association_name, association_type) ⇒ Object

When a has_and_belongs_to_many relationship, we don't have a foreign key that can be null'd. Instead, go through the ActiveRecord API.



91
92
93
94
95
96
97
# File 'lib/jsonapi_compliable/adapters/active_record.rb', line 91

def disassociate(parent, child, association_name, association_type)
  if association_type == :habtm
    parent.send(association_name).delete(child)
  else
    # Nothing to do here, happened when we merged foreign key
  end
end

#filter(scope, attribute, value) ⇒ Object

Returns the scope.

Examples:

ActiveRecord default

def filter(scope, attribute, value)
  scope.where(attribute => value)
end


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

def filter(scope, attribute, value)
  scope.where(attribute => value)
end

#maximum(scope, attr) ⇒ Numeric

Returns the maximum value of the scope.

Examples:

ActiveRecord default

def maximum(scope, attr)
  scope.maximum(attr)
end


42
43
44
# File 'lib/jsonapi_compliable/adapters/active_record.rb', line 42

def maximum(scope, attr)
  scope.maximum(attr)
end

#minimum(scope, attr) ⇒ Numeric

Returns the maximum value of the scope.

Examples:

ActiveRecord default

def maximum(scope, attr)
  scope.maximum(attr)
end


47
48
49
# File 'lib/jsonapi_compliable/adapters/active_record.rb', line 47

def minimum(scope, attr)
  scope.minimum(attr)
end

#order(scope, attribute, direction) ⇒ Object

Returns the scope.

Examples:

ActiveRecord default

def order(scope, attribute, direction)
  scope.order(attribute => direction)
end


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

def order(scope, attribute, direction)
  scope.order(attribute => direction)
end

#paginate(scope, current_page, per_page) ⇒ Object

Returns the scope.

Examples:

ActiveRecord default

# via kaminari gem
def paginate(scope, current_page, per_page)
  scope.page(current_page).per(per_page)
end


18
19
20
# File 'lib/jsonapi_compliable/adapters/active_record.rb', line 18

def paginate(scope, current_page, per_page)
  scope.page(current_page).per(per_page)
end

#resolve(scope) ⇒ Object

Resolve the scope. This is where you'd actually fire SQL, actually make an HTTP call, etc.

Examples:

ActiveRecordDefault

def resolve(scope)
  scope.to_a
end

Suggested Customization

# When making a service call, we suggest this abstraction
# 'scope' here is a hash
def resolve(scope)
  # The implementation of .where can be whatever you want
  SomeModelClass.where(scope)
end

See Also:



52
53
54
# File 'lib/jsonapi_compliable/adapters/active_record.rb', line 52

def resolve(scope)
  scope.to_a
end

#sideloading_moduleObject

This module gets mixed in to Sideload classes This is where you define methods like has_many, belongs_to etc that wrap the lower-level Sideload#allow_sideload



67
68
69
# File 'lib/jsonapi_compliable/adapters/active_record.rb', line 67

def sideloading_module
  JsonapiCompliable::Adapters::ActiveRecordSideloading
end

#sum(scope, attr) ⇒ Numeric

Returns the sum of the scope.

Examples:

ActiveRecord default

def sum(scope, attr)
  scope.sum(attr)
end


37
38
39
# File 'lib/jsonapi_compliable/adapters/active_record.rb', line 37

def sum(scope, attr)
  scope.sum(attr)
end

#transaction(model_class) ⇒ Object

Run this write request within an ActiveRecord transaction



60
61
62
63
64
# File 'lib/jsonapi_compliable/adapters/active_record.rb', line 60

def transaction(model_class)
  model_class.transaction do
    yield
  end
end

#update(model_class, update_params) ⇒ Object

Returns the model instance just created.

Examples:

ActiveRecord default

def update(model_class, update_params)
  instance = model_class.find(update_params.delete(:id))
  instance.update_attributes(update_params)
  instance
end

See Also:



107
108
109
110
111
# File 'lib/jsonapi_compliable/adapters/active_record.rb', line 107

def update(model_class, update_params)
  instance = model_class.find(update_params.delete(:id))
  instance.update_attributes(update_params)
  instance
end