module Sequel::Mapper

Constants

VERSION

Attributes

dataset[R]
db[R]
model[R]
primary_key[R]

Public Class Methods

new(options) click to toggle source
# File lib/sequel/mapper.rb, line 10
def initialize(options)
  if options.is_a? Sequel::Dataset
    @db = options.db
    ds = options
  elsif options.is_a? Sequel::Database
    @db = options
    raise ArgumentError, 'no dataset defined' if self.class._dataset.nil?
    ds = db[self.class._dataset]
  else
    raise ArgumentError, 'no database or dataset'
  end
  @dataset = ds.with_row_proc method(:data_to_object)
  @model = self.class._model || Sequel::Mapper::Struct.new(*dataset.columns)
  @primary_key = self.class._primary_key || :id
end

Private Class Methods

included(receiver) click to toggle source
# File lib/sequel/mapper.rb, line 125
def self.included(receiver)
  receiver.extend ClassMethods
end

Public Instance Methods

[](key)
Alias for: find
create(object) click to toggle source
# File lib/sequel/mapper.rb, line 28
def create(object)
  id = dataset.insert object_to_data(object)
  object.send("#{primary_key}=", id) unless object.public_send(primary_key)
end
delete(object) click to toggle source
# File lib/sequel/mapper.rb, line 42
def delete(object)
  find_object(object).delete
end
find(key) click to toggle source
# File lib/sequel/mapper.rb, line 33
def find(key)
  find_object(key: key).first
end
Also aliased as: []
graph(*args) click to toggle source
# File lib/sequel/mapper.rb, line 67
def graph(*args)
  scope dataset.extension(:graph_each).graph(*args)
end
persist(object) click to toggle source
# File lib/sequel/mapper.rb, line 46
def persist(object)
  if find_object(object).nil?
    create(object)
  else
    update(object)
  end
end
update(object) click to toggle source
# File lib/sequel/mapper.rb, line 38
def update(object)
  find_object(object).update(object_to_data(object))
end
with(mapper_class, join, options = {}) click to toggle source
# File lib/sequel/mapper.rb, line 71
def with(mapper_class, join, options = {})
  graph(dataset_for_mapper_class(mapper_class), join, options)
end

Private Instance Methods

data_to_object(data) click to toggle source
# File lib/sequel/mapper.rb, line 88
def data_to_object(data)
  model.new data
end
dataset_for_mapper_class(mapper_class) click to toggle source
# File lib/sequel/mapper.rb, line 104
def dataset_for_mapper_class(mapper_class)
  mapper_class.new(db).dataset
end
find_object(object=nil, key: object.public_send(primary_key)) click to toggle source
# File lib/sequel/mapper.rb, line 92
def find_object(object=nil, key: object.public_send(primary_key))
  dataset.where(pk_with_table => key) if key
end
object_to_data(object) click to toggle source
# File lib/sequel/mapper.rb, line 79
def object_to_data(object)
  dataset.columns.each_with_object({}) do |column, data|
    if object.respond_to?(column)
      value = object.public_send(column)
      data[column] = value unless value.nil?
    end
  end
end
pk_with_table() click to toggle source
# File lib/sequel/mapper.rb, line 96
def pk_with_table
  "#{dataset.first_source_table}__#{primary_key}".to_sym
end
scope(dataset) click to toggle source
# File lib/sequel/mapper.rb, line 100
def scope(dataset)
  self.class.new(dataset)
end