Class: SequelRecordStore

Inherits:
Object
  • Object
show all
Defined in:
lib/sequel_record_store.rb

Constant Summary collapse

VERSION =
"0.4.0"

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(record) ⇒ SequelRecordStore

Returns a new instance of SequelRecordStore.



57
58
59
# File 'lib/sequel_record_store.rb', line 57

def initialize(record)
  @record = record
end

Class Method Details

.<<Object



25
26
27
# File 'lib/sequel_record_store.rb', line 25

def put(record)
  new(record).put
end

.databaseObject



5
6
7
# File 'lib/sequel_record_store.rb', line 5

def database
  raise "You must setup your database"
end

.datasetObject



13
14
15
# File 'lib/sequel_record_store.rb', line 13

def dataset
  database[dataset_name]
end

.dataset_nameObject



9
10
11
# File 'lib/sequel_record_store.rb', line 9

def dataset_name
  @dataset_name ||= name.sub(/Store$/,'').tableize.to_sym
end

.get(id) ⇒ Object Also known as: []



17
18
19
# File 'lib/sequel_record_store.rb', line 17

def get(id)
  dataset.where(id: id).first
end

.put(record) ⇒ Object



22
23
24
# File 'lib/sequel_record_store.rb', line 22

def put(record)
  new(record).put
end

.required_attributes(*record) ⇒ Object



38
39
40
41
42
43
44
# File 'lib/sequel_record_store.rb', line 38

def required_attributes(*record)
  record.each do |attribute|
    validations << proc do
      errors << "#{attribute.to_s.titleize} is required" unless @record[attribute].present?
    end
  end
end

.required_foreign_key(attribute, table) ⇒ Object



46
47
48
49
50
51
52
53
54
# File 'lib/sequel_record_store.rb', line 46

def required_foreign_key(attribute, table)
  validations << proc do
    if @record[attribute].blank?
      errors << "#{attribute} is required"
    elsif database[table].where(id: @record[attribute]).get(:id).blank?
      errors << "no #{table.to_s.singularize} with id=#{@record[attribute]}"
    end
  end
end

.type_column_map(database) ⇒ Object



27
28
29
30
31
32
# File 'lib/sequel_record_store.rb', line 27

def type_column_map(database)
  @type_column_map ||= database.schema(dataset_name).each_with_object({}) do |(column,),map|
    map[[:db_type]] ||= []
    map[[:db_type]] << column
  end
end

.validationsObject



34
35
36
# File 'lib/sequel_record_store.rb', line 34

def validations
  @validations ||= []
end

Instance Method Details

#databaseObject



80
81
82
# File 'lib/sequel_record_store.rb', line 80

def database
  self.class.database
end

#datasetObject



84
85
86
# File 'lib/sequel_record_store.rb', line 84

def dataset
  self.class.dataset
end

#errorsObject



88
89
90
# File 'lib/sequel_record_store.rb', line 88

def errors
  @errors ||= []
end

#exists?Boolean

Returns:

  • (Boolean)


111
112
113
# File 'lib/sequel_record_store.rb', line 111

def exists?
  !dataset.select(1).where(id: @record[:id]).empty?
end

#insertObject



115
116
117
# File 'lib/sequel_record_store.rb', line 115

def insert
  @record[:id] = dataset.insert(@record.except(:errors))
end

#putObject



61
62
63
64
65
66
67
68
69
# File 'lib/sequel_record_store.rb', line 61

def put
  typecast
  transform
  return { errors: 'no record provided' } if @record.blank?
  validate
  return { errors: errors } if errors.present?

  save
end

#saveObject



71
72
73
74
75
76
77
78
# File 'lib/sequel_record_store.rb', line 71

def save
  if exists?
    update
  else
    insert
  end
  @record
end

#transformObject



102
103
# File 'lib/sequel_record_store.rb', line 102

def transform
end

#typecastObject



92
93
94
95
96
97
98
99
100
# File 'lib/sequel_record_store.rb', line 92

def typecast
  if database.database_type == :postgres
    Array(self.class.type_column_map(database)['json']).each do |json_column|
      if @record[json_column]
        @record[json_column] = Sequel.pg_json(@record[json_column])
      end
    end
  end
end

#updateObject



119
120
121
# File 'lib/sequel_record_store.rb', line 119

def update
  dataset.where(id: @record[:id]).update(@record.except(:id, :errors))
end

#validateObject



105
106
107
108
109
# File 'lib/sequel_record_store.rb', line 105

def validate
  self.class.validations.each do |validation|
    instance_eval(&validation)
  end
end