module Her::Model::ORM::ClassMethods

Public Instance Methods

blank_relation() click to toggle source

@private

# File lib/her/model/orm.rb, line 292
def blank_relation
  @blank_relation ||= superclass.blank_relation.clone.tap { |r| r.parent = self } if superclass.respond_to?(:blank_relation)
  @blank_relation ||= Relation.new(self)
end
build(attributes = {}) click to toggle source

Build a new resource with the given attributes. If the request_new_object_on_build flag is set, the new object is requested via API.

# File lib/her/model/orm.rb, line 275
def build(attributes = {})
  params = attributes
  return new(params) unless request_new_object_on_build?

  path = build_request_path(params.merge(primary_key => 'new'))
  method = method_for(:new)

  resource = nil
  request(params.merge(:_method => method, :_path => path)) do |parsed_data, response|
    if response.success?
      resource = new_from_parsed_data(parsed_data)
    end
  end
  resource
end
default_scope(block = nil) click to toggle source

Define the default scope for the model

@example

class User
  include Her::Model

  default_scope lambda { where(:admin => 1) }
enc

User.all # Called via GET "/users?admin=1"
User.new.admin # => 1
# File lib/her/model/orm.rb, line 209
def default_scope(block = nil)
  @_her_default_scope ||= (!respond_to?(:default_scope) && superclass.respond_to?(:default_scope)) ? superclass.default_scope : scoped
  @_her_default_scope = @_her_default_scope.instance_exec(&block) unless block.nil?
  @_her_default_scope
end
destroy_existing(id, params = {}) click to toggle source

Destroy an existing resource

@example

User.destroy_existing(1)
# Called via DELETE "/users/1"
# File lib/her/model/orm.rb, line 248
def destroy_existing(id, params = {})
  request(params.merge(:_method => method_for(:destroy), :_path => build_request_path(params.merge(primary_key => id)))) do |parsed_data, response|
    data = parse(parsed_data[:data])
    metadata = parsed_data[:metadata]
    response_errors = parsed_data[:errors]
    record = new(data.merge(:_destroyed => response.success?, :metadata => metadata))
    record.response_errors = response_errors
    record
  end
end
method_for(action = nil, method = nil) click to toggle source

Return or change the HTTP method used to create or update records

@param [Symbol, String] action The behavior in question (`:create` or `:update`) @param [Symbol, String] method The HTTP method to use (`'PUT'`, `:post`, etc.)

# File lib/her/model/orm.rb, line 263
def method_for(action = nil, method = nil)
  @method_for ||= (superclass.respond_to?(:method_for) ? superclass.method_for : {})
  return @method_for if action.nil?

  action = action.to_s.downcase.to_sym

  return @method_for[action] if method.nil?
  @method_for[action] = method.to_s.downcase.to_sym
end
save_existing(id, params) click to toggle source

Save an existing resource and return it

@example

@user = User.save_existing(1, { :fullname => "Tobias Fünke" })
# Called via PUT "/users/1"
# File lib/her/model/orm.rb, line 230
def save_existing(id, params)
  save_existing!(id, params)
rescue Her::Errors::ResourceInvalid => e
  e.resource
end
save_existing!(id, params) click to toggle source

Similar to .save_existing but raises ResourceInvalid if save fails

# File lib/her/model/orm.rb, line 237
def save_existing!(id, params)
  resource = new(params.merge(primary_key => id))
  resource.save!
  resource
end
scope(name, code) click to toggle source

Create a new chainable scope

@example

class User
  include Her::Model

  scope :admins, lambda { where(:admin => 1) }
  scope :page, lambda { |page| where(:page => page) }
enc

User.admins # Called via GET "/users?admin=1"
User.page(2).all # Called via GET "/users?page=2"
# File lib/her/model/orm.rb, line 183
def scope(name, code)
  # Add the scope method to the class
  (class << self; self end).send(:define_method, name) do |*args|
    instance_exec(*args, &code)
  end

  # Add the scope method to the default/blank relation
  scoped.define_singleton_method(name) { |*args| instance_exec(*args, &code) }
end
scoped() click to toggle source

@private

# File lib/her/model/orm.rb, line 194
def scoped
  @_her_default_scope || blank_relation
end