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.



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

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.



107
108
109
# File 'lib/her/model/orm.rb', line 107

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"


69
70
71
72
73
74
75
76
77
78
# File 'lib/her/model/orm.rb', line 69

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|
      load_from_parsed_data(parsed_data)
      @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.



84
85
86
87
88
# File 'lib/her/model/orm.rb', line 84

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.



92
93
94
95
# File 'lib/her/model/orm.rb', line 92

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">


143
144
145
146
147
# File 'lib/her/model/orm.rb', line 143

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
# 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
      self.class.request(to_params.merge(:_method => method, :_path => request_path)) do |parsed_data, response|
        load_from_parsed_data(parsed_data)
        return false if !response.success? || @response_errors.any?
        changes_applied
      end
    end
  end

  self
end

#save!Object

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



56
57
58
59
60
61
# File 'lib/her/model/orm.rb', line 56

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


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

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.



128
129
130
# File 'lib/her/model/orm.rb', line 128

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