Module: Her::Model::ORM

Extended by:
ActiveSupport::Concern
Included in:
Her::Model
Defined in:
lib/her/model/orm.rb

Overview

This module adds ORM-like capabilities to the model

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#decrement(attribute, by = 1) ⇒ Object

Initializes attribute to zero if nil and substracts the value passed as by (default is 1). The decrement is performed directly on the underlying attribute, no setter is invoked. Only makes sense for number-based attributes. Returns self.



148
149
150
# File 'lib/her/model/orm.rb', line 148

def decrement(attribute, by = 1)
  increment(attribute, -by)
end

#decrement!(attribute, by = 1) ⇒ Object

Wrapper around #decrement that saves the resource. Saving is subjected to validation checks. Returns self.



154
155
156
# File 'lib/her/model/orm.rb', line 154

def decrement!(attribute, by = 1)
  increment!(attribute, -by)
end

#destroy(params = {}) ⇒ Object

Destroy a resource

Examples:

@user = User.find(1)
@user.destroy
# Called via DELETE "/users/1"


76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/her/model/orm.rb', line 76

def destroy(params = {})
  method = self.class.method_for(:destroy)
  run_callbacks :destroy do
    self.class.request(params.merge(:_method => method, :_path => request_path)) do |parsed_data, response|
      assign_attributes(self.class.parse(parsed_data[:data])) if parsed_data[:data].any?
      @metadata = parsed_data[:metadata]
      @response_errors = parsed_data[:errors]
      @destroyed = response.success?
    end
  end
  self
end

#destroyed?Boolean

Return whether the object has been destroyed

Returns:

  • (Boolean)


20
21
22
# File 'lib/her/model/orm.rb', line 20

def destroyed?
  @destroyed == true
end

#increment(attribute, by = 1) ⇒ Object

Initializes attribute to zero if nil and adds the value passed as by (default is 1). The increment is performed directly on the underlying attribute, no setter is invoked. Only makes sense for number-based attributes. Returns self.



131
132
133
134
135
# File 'lib/her/model/orm.rb', line 131

def increment(attribute, by = 1)
  attributes[attribute] ||= 0
  attributes[attribute] += by
  self
end

#increment!(attribute, by = 1) ⇒ Object

Wrapper around #increment that saves the resource. Saving is subjected to validation checks. Returns self.



139
140
141
142
# File 'lib/her/model/orm.rb', line 139

def increment!(attribute, by = 1)
  increment(attribute, by) && save
  self
end

#new?Boolean Also known as: new_record?

Return `true` if a resource was not saved yet

Returns:

  • (Boolean)


9
10
11
# File 'lib/her/model/orm.rb', line 9

def new?
  id.nil?
end

#persisted?Boolean

Return `true` if a resource is not `#new?`

Returns:

  • (Boolean)


15
16
17
# File 'lib/her/model/orm.rb', line 15

def persisted?
  !new?
end

#reload(options = nil) ⇒ Object

Refetches the resource

This method finds the resource by its primary key (which could be assigned manually) and modifies the object in-place.

Examples:

user = User.find(1)
# => #<User(users/1) id=1 name="Tobias Fünke">
user.name = "Oops"
user.reload # Fetched again via GET "/users/1"
# => #<User(users/1) id=1 name="Tobias Fünke">


100
101
102
103
104
# File 'lib/her/model/orm.rb', line 100

def reload(options = nil)
  fresh_object = self.class.find(id)
  assign_attributes(fresh_object.attributes)
  self
end

#saveObject

Save a resource and return `false` if the response is not a successful one or if there are errors in the resource. Otherwise, return the newly updated resource

Examples:

Save a resource after fetching it

@user = User.find(1)
# Fetched via GET "/users/1"
@user.fullname = "Tobias Fünke"
@user.save
# Called via PUT "/users/1"

Save a new resource by creating it

@user = User.new({ :fullname => "Tobias Fünke" })
@user.save
# Called via POST "/users"


38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/her/model/orm.rb', line 38

def save
  callback = new? ? :create : :update
  method = self.class.method_for(callback)

  run_callbacks :save do
    run_callbacks callback do
      params = to_params
      self.class.request(to_params.merge(:_method => method, :_path => request_path)) do |parsed_data, response|
        assign_attributes(self.class.parse(parsed_data[:data])) if parsed_data[:data].any?
        @metadata = parsed_data[:metadata]
        @response_errors = parsed_data[:errors]

        return false if !response.success? || @response_errors.any?
        if self.changed_attributes.present?
          @previously_changed = self.changes.clone
          self.changed_attributes.clear
        end
      end
    end
  end

  self
end

#save!Object

Similar to save(), except that ResourceInvalid is raised if the save fails



63
64
65
66
67
68
# File 'lib/her/model/orm.rb', line 63

def save!
  if !self.save
    raise Her::Errors::ResourceInvalid, self
  end
  self
end

#toggle(attribute) ⇒ Object

Assigns to attribute the boolean opposite of attribute?. So if the predicate returns true the attribute will become false. This method toggles directly the underlying value without calling any setter. Returns self.

Examples:

user = User.first
user.admin? # => false
user.toggle(:admin)
user.admin? # => true


116
117
118
119
# File 'lib/her/model/orm.rb', line 116

def toggle(attribute)
  attributes[attribute] = !public_send("#{attribute}?")
  self
end

#toggle!(attribute) ⇒ Object

Wrapper around #toggle that saves the resource. Saving is subjected to validation checks. Returns true if the record could be saved.



123
124
125
# File 'lib/her/model/orm.rb', line 123

def toggle!(attribute)
  toggle(attribute) && save
end