Class: Twimock::Database::Table

Inherits:
Object
  • Object
show all
Defined in:
lib/twimock/database/table.rb

Direct Known Subclasses

AccessToken, Application, RequestToken, User

Constant Summary collapse

TABLE_NAME =

以下は継承先でオーバーライド必須

* TABLE_NAME, COLUMN_NAMES
* initialize()
:tables
COLUMN_NAMES =
[:id, :text, :active, :number, :created_at]
CHILDREN =
[]

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Table

Returns a new instance of Table.



15
16
17
18
19
20
21
22
# File 'lib/twimock/database/table.rb', line 15

def initialize(options={})
  opts = Hashie::Mash.new(options)
  self.id = opts.id
  self.text = opts.text
  self.active = opts.active || false
  self.number = opts.number
  self.created_at = opts.created_at
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/twimock/database/table.rb', line 57

def method_missing(name, *args)
  method_name = name.to_s.include?("=") ? name.to_s[0...-1].to_sym : name
  case name
  when :identifier  then return send(:id)
  when :identifier= then return send(:id=, *args)
  else
    if column_names.include?(method_name) && args.size <= 1
      if !name.to_s.include?("=") && args.empty?
        define_column_getter(name)
        return send(name)
      else
        define_column_setter(name)
        return send(name, args.first)
      end
    else
      super
    end
  end
end

Class Method Details

.allObject



83
84
85
86
# File 'lib/twimock/database/table.rb', line 83

def self.all
  records = execute "SELECT * FROM #{table_name};"
  records_to_objects(records)
end

.childrenObject



137
138
139
# File 'lib/twimock/database/table.rb', line 137

def self.children
  self::CHILDREN
end

.column_namesObject



133
134
135
# File 'lib/twimock/database/table.rb', line 133

def self.column_names
  self::COLUMN_NAMES
end

.column_type(column_name) ⇒ Object



141
142
143
144
# File 'lib/twimock/database/table.rb', line 141

def self.column_type(column_name)
  return nil unless column_names.include?(column_name.to_s.to_sym)
  table_info.send(column_name).type
end

.create!(options = {}) ⇒ Object



77
78
79
80
81
# File 'lib/twimock/database/table.rb', line 77

def self.create!(options={})
  instance = self.new(options)
  instance.save!
  instance
end

.firstObject



88
89
90
91
# File 'lib/twimock/database/table.rb', line 88

def self.first
  records = execute "SELECT * FROM #{table_name} LIMIT 1;"
  record_to_object(records.first)
end

.lastObject



93
94
95
96
# File 'lib/twimock/database/table.rb', line 93

def self.last
  records = execute "SELECT * FROM #{table_name} ORDER BY ID DESC LIMIT 1 ;"
  record_to_object(records.first)
end

.method_missing(name, *args) ⇒ Object



107
108
109
110
111
112
113
114
115
# File 'lib/twimock/database/table.rb', line 107

def self.method_missing(name, *args)
  if ((name =~ /^find_by_(.+)/ || name =~ /^find_all_by_(.+)/) && 
    (column_name = $1) && column_names.include?(column_name.to_sym))
    raise ArgumentError, "wrong number of arguments (#{args.size} for 1)" unless args.size == 1
    define_find_method(name, column_name) ? send(name, args.first) : super
  else
    super
  end
end

.table_infoObject



146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/twimock/database/table.rb', line 146

def self.table_info
  sql = "PRAGMA TABLE_INFO(#{table_name});"
  records = execute sql
  info = Hashie::Mash.new
  records.each do |record|
    column_info = Hashie::Mash.new(
      { cid:         record[0],
        name:        record[1].to_sym,
        type:        record[2],
        notnull:    (record[3] == 1),
        dflt_value:  record[4],
        pk:         (record[5] == 1) }
    )
    info.send(record[1] + "=", column_info)
  end
  info
end

.table_nameObject



129
130
131
# File 'lib/twimock/database/table.rb', line 129

def self.table_name
  self::TABLE_NAME
end

.where(column) ⇒ Object



98
99
100
101
102
103
104
105
# File 'lib/twimock/database/table.rb', line 98

def self.where(column)
  column_name = column.keys.first
  value = column.values.first
  column_value = (value.kind_of?(String)) ? "'" + value + "'" : value.to_s

  records = execute "SELECT * FROM #{table_name} WHERE #{column_name} = #{column_value};"
  records_to_objects(records)
end

Instance Method Details

#column_namesObject



121
122
123
# File 'lib/twimock/database/table.rb', line 121

def column_names
  self.class.column_names
end

#destroyObject



34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/twimock/database/table.rb', line 34

def destroy
  raise unless persisted?
  self.class.children.each do |klass|
    klass_last_name = self.class.name.split("::").last.downcase
    find_method_name = "find_all_by_#{klass_last_name}_id"
    objects = klass.send(find_method_name, self.id)
    objects.each{|object| object.destroy }
  end

  execute "DELETE FROM #{table_name} WHERE ID = #{self.id};"
  self
end

#fetchObject



47
48
49
50
51
52
53
54
55
# File 'lib/twimock/database/table.rb', line 47

def fetch
  if persisted?
    sql = "SELECT * FROM #{table_name} WHERE ID = #{self.id} LIMIT 1;"
    records = execute sql
    return nil unless record = records.first
    set_attributes_from_record(record)
    self
  end
end

#persisted?Boolean

Returns:

  • (Boolean)


125
126
127
# File 'lib/twimock/database/table.rb', line 125

def persisted?
  !!(self.id && !(self.class.find_by_id(self.id).nil?))
end

#save!(options = {}) ⇒ Object



24
25
26
# File 'lib/twimock/database/table.rb', line 24

def save!(options={})
  persisted? ? update!(options) : insert!(options)
end

#table_nameObject



117
118
119
# File 'lib/twimock/database/table.rb', line 117

def table_name
  self.class.table_name
end

#update_attributes!(options) ⇒ Object



28
29
30
31
32
# File 'lib/twimock/database/table.rb', line 28

def update_attributes!(options)
  # カラムに含まれるかどうかの確認。なければNoMethodError
  options.each_key {|key| self.send(key) }
  persisted? ? update!(options) : insert!(options)
end