class Wings::Model::SQLite
Public Class Methods
all()
click to toggle source
# File lib/wings/sqlite_model.rb, line 38 def self.all all_rows = db.execute <<SQL SELECT * FROM #{table}; SQL all_rows.map do |row| data = Hash[schema.keys.zip(row)] self.new(data) end end
count()
click to toggle source
# File lib/wings/sqlite_model.rb, line 49 def self.count sql = <<SQL SELECT COUNT(*) FROM #{table}; SQL db.execute(sql)[0][0] end
create(values)
click to toggle source
# File lib/wings/sqlite_model.rb, line 8 def self.create(values) keys_without_id = schema.keys - ['id'] db_attributes = keys_without_id.reduce({}) do |memo, key| memo[key] = values[key] ? to_sql(values[key]) : 'null' memo end db.execute <<SQL INSERT INTO #{table} (#{db_attributes.keys.join(',')}) VALUES (#{db_attributes.values.join(',')}); SQL data = keys_without_id.reduce({}) do |memo, key| memo[key] = values[key] memo end data['id'] = db.execute('SELECT last_insert_rowid();')[0][0] self.new(data) end
find(id)
click to toggle source
# File lib/wings/sqlite_model.rb, line 29 def self.find(id) target = db.execute <<SQL SELECT * FROM #{table} WHERE id = #{id}; SQL data = Hash[schema.keys.zip(target[0])] self.new(data) end
new(data = nil)
click to toggle source
# File lib/wings/sqlite_model.rb, line 66 def initialize(data = nil) @data = data end
schema()
click to toggle source
# File lib/wings/sqlite_model.rb, line 56 def self.schema return @schema if @schema @schema = {} db.table_info(table) do |row| @schema[row['name']] = row['type'] end @schema end
Private Class Methods
db()
click to toggle source
# File lib/wings/sqlite_model.rb, line 115 def self.db project_name = Dir.pwd.split('/').last @@db ||= SQLite3::Database.new("db/#{project_name}.db") end
table()
click to toggle source
# File lib/wings/sqlite_model.rb, line 120 def self.table Wings.to_underscore name end
to_sql(val)
click to toggle source
# File lib/wings/sqlite_model.rb, line 124 def self.to_sql(val) case val when NilClass 'null' when Numeric val.to_s when String "'#{val}'" else raise "Can't change #{val.class} to SQL. Bummer." end end
Public Instance Methods
[](name)
click to toggle source
# File lib/wings/sqlite_model.rb, line 70 def [](name) @data[name.to_s] end
[]=(name, value)
click to toggle source
# File lib/wings/sqlite_model.rb, line 74 def []=(name, value) @data[name.to_s] = value end
method_missing(name, *args)
click to toggle source
column accessor
Calls superclass method
# File lib/wings/sqlite_model.rb, line 102 def method_missing(name, *args) unless self.class.schema.keys.include?(name.to_s) return super end self.class.define_method(name.to_sym) do @data[name.to_s] end @data[name.to_s] end
save()
click to toggle source
# File lib/wings/sqlite_model.rb, line 97 def save self.save! rescue false end
save!()
click to toggle source
# File lib/wings/sqlite_model.rb, line 78 def save! unless @data['id'] self.class.create(@data) return true end fields = @data.map do |key, value| "#{key}=#{self.class.to_sql(value)}" end.join(',') self.class.db.execute <<SQL UPDATE #{self.class.table} SET #{fields} WHERE id = #{@data['id']}; SQL true end