rollerskates 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7ae0700f032e105dbc7cbb89d83cc9b19b964a4b
4
- data.tar.gz: 1a72d44264c07dca64df5fcb2f37f0bec46f1281
3
+ metadata.gz: 290bc3701e17c3951d3f2c07064d3323e54508bc
4
+ data.tar.gz: 3b89ebea759281b73d0aa902325251a15e060440
5
5
  SHA512:
6
- metadata.gz: f6f092c09b853b9fa3c7337454746f0e30e41b258a47e90653b3f9c069e2dcd84e4f256b07a45968a5af2e96e8600fd448c31c0a2fe018c66d86423ac9c696bc
7
- data.tar.gz: aa7aa9be0a13306ded382ed5cd740f9ae55b3091b54214c22a5a1169ae6261910e5e025f4c3c70fa4b82aac32fd472a2d86424e743fd532de8842255358c6668
6
+ metadata.gz: 811a08e65001fec6c57d71bec7aa857d57cc910b25e1c5288e4dd9a3f4f5af68d0693415165dae414ec8d31687469fd093fef98fe1044fa0b120d3e2ff0d9f6a
7
+ data.tar.gz: 4c3f6fe6477224e872393a1a5875952df243e41c37273082f6a09fd28ac5d3388ec17813f8ddc848685efaf20da33269b2463869f44e70c2bdfd35e9fd6c61e7
data/.rubocop.yml CHANGED
@@ -60,7 +60,6 @@ Style/PredicateName:
60
60
  Enabled: true
61
61
  NamePrefix:
62
62
  - is_
63
- - has_
64
63
  - have_
65
64
  NamePrefixBlacklist:
66
65
  - is_
data/README.md CHANGED
@@ -36,7 +36,7 @@ app_name
36
36
  | └─── routes.rb
37
37
  | └───application.rb
38
38
  └───db
39
- | └───development.sqlite3
39
+ | └───app.db
40
40
  └───config.ru
41
41
  ```
42
42
 
@@ -57,10 +57,13 @@ Allow your application class to inherit form `Rollerskates::Application` class
57
57
  Set up your routes this way:
58
58
 
59
59
  ```ruby
60
- require "/config/application.rb"
60
+ APP_ROOT = __dir__
61
+ require_relative "./config/application.rb"
61
62
  TodoApplication = Todolist::Application.new
63
+ use Rack::Reloader, 0
62
64
  use Rack::MethodOverride
63
- require "/config/routes.rb"
65
+ require_relative "./config/routes.rb"
66
+ use Rack::Static, urls: ["/css", "/js", "/fonts"], root: "/app/assets"
64
67
  run TodoApplication
65
68
  ```
66
69
 
@@ -104,10 +107,30 @@ class Item < Rollerskates::BaseRecord
104
107
  property :status, type: :boolean, nullable: false
105
108
 
106
109
  create_table
110
+ belongs_to :user
111
+ has_many :product
112
+
113
+ def self.recent
114
+ order("id DESC").limit(5)
115
+ end
107
116
  end
108
117
  ```
109
118
  Rolletskates automatically adds the `id, created_at and updated_at` fields and thus need not to be specified in the model. Other properties, however should be specified as above.
110
119
 
120
+ You can make use of associations with the rollerskates framework. Also, you can chain methods to a degree. Rollerskates ORM can accommodate chaining such as:
121
+ > `select(:prop1, :prop2, :prop3)`
122
+ >
123
+ > `where(prop2: "Value")`
124
+ >
125
+ > `order("prop DESC")`
126
+ >
127
+ > `limit(5)`
128
+
129
+ And combinations such as:
130
+ > `select(:id, :name).where(status: "active").limit(5)`
131
+
132
+ NB: Unlike Rails, `Rollerskates` uses sigular expression for both `has_many` and `belongs_to`
133
+
111
134
  ### Views
112
135
 
113
136
  ```
@@ -116,9 +139,13 @@ Rolletskates automatically adds the `id, created_at and updated_at` fields and t
116
139
  | └───items
117
140
  | |____ new.erb
118
141
  | |____ show.erb
142
+ |───────layouts
143
+ | |____ application.erb
119
144
 
120
145
  ```
121
- Files in the view folder should be organized according to the controller and action name.
146
+ Files in the view folder should be organized according to the controller and action name. Instance variables declared in the respective controller action are available to your view.
147
+
148
+ The views make use of a layouts. You can abstract common elements in all your views to the `views/layouts/application.erb` file.
122
149
  ## Testing
123
150
 
124
151
  The tests could be run automatically by using
data/db/app.db CHANGED
Binary file
@@ -1,116 +1,63 @@
1
- require "rollerskates/helpers/model_helper"
1
+ require "rollerskates/orm/helpers/database_table_helper"
2
+ require "rollerskates/orm/associable"
3
+ require "rollerskates/orm/query_builder"
2
4
 
3
5
  module Rollerskates
4
- class BaseModel < Rollerskates::ModelHelper
6
+ class BaseModel
7
+ extend Rollerskates::Associable
8
+ extend Rollerskates::DatabaseTableHelper
9
+
5
10
  def initialize(values = {})
6
11
  hash_to_properties(values) unless values.empty?
7
12
  end
8
13
 
9
- def hash_to_properties(hash)
10
- hash.each do |column, value|
11
- instance_variable_set("@#{column}", value)
12
- end
13
- end
14
-
15
- def update(hash)
16
- hash_to_properties(hash)
17
- @updated_at = Time.now.to_s
18
- end
19
-
20
14
  def save
21
- create_columns_placeholders_values
22
- if id
23
- database.execute(update_query, values_for_update)
24
- else
25
- add_created_at_and_updated_at
26
- database.execute "INSERT INTO #{table_name} (#{@columns.join(', ')})\
27
- VALUES (#{@placeholders.join(', ')})", @values
28
- end
15
+ self.class.query.build(to_hash).save
29
16
  end
30
17
 
31
- def placeholders_for_update
32
- placeholders = @columns.map { |col| col + " = ?" }
33
- placeholders.join(", ")
18
+ def self.find(value)
19
+ query.where({ id: value }, true)
34
20
  end
35
21
 
36
- def values_for_update
37
- @values << id
38
- end
39
-
40
- def create_columns_placeholders_values
41
- @model = self
42
- @columns = []
43
- @placeholders = []
44
- @values = []
45
-
46
- all_columns.each do |column|
47
- value = @model.send(column)
48
- next unless value
49
- @columns << column.to_s
50
- @placeholders << "?"
51
- @values << value
52
- end
22
+ def self.find_by(find_conditions)
23
+ query.where(find_conditions, true)
53
24
  end
54
25
 
55
- def add_created_at_and_updated_at
56
- @columns << %w(created_at updated_at)
57
- @placeholders << ["?", "?"]
58
- @values << [Time.now.to_s, Time.now.to_s]
26
+ def self.last(number = nil)
27
+ query.order("id DESC").first(number)
59
28
  end
60
29
 
61
- def self.create(values)
62
- new(values).save
30
+ def self.create(create_parameters)
31
+ query.build(create_parameters).save
63
32
  end
64
33
 
65
34
  def self.all
66
- data = database.execute "SELECT #{all_columns.join(', ')}\
67
- FROM #{table_name}"
68
- data.map do |row|
69
- row_to_object(row)
70
- end
71
- end
72
-
73
- def self.count
74
- data = database.execute "SELECT COUNT(*) FROM #{table_name}"
75
- data.flatten.first
35
+ query
76
36
  end
77
37
 
78
- def self.first
79
- data = database.execute "SELECT #{all_columns.join(', ')} \
80
- FROM #{table_name} ORDER BY id ASC LIMIT 1"
81
- row_to_object(data.flatten)
38
+ def self.query
39
+ Rollerskates::QueryBuilder.new self
82
40
  end
83
41
 
84
- def self.last
85
- data = database.execute "SELECT #{all_columns.join(', ')} \
86
- FROM #{table_name} ORDER BY id DESC LIMIT 1"
87
- row_to_object(data.flatten)
42
+ def self.method_missing(method, *args, &block)
43
+ query.send(method, *args, &block)
88
44
  end
89
45
 
90
- def self.find(id)
91
- data = database.execute "SELECT #{all_columns.join(', ')}\
92
- FROM #{table_name} WHERE id = ?", id
93
- row_to_object data.flatten
94
- end
95
-
96
- def destroy
97
- database.execute "DELETE FROM #{table_name} WHERE id = ?", id
98
- end
46
+ private
99
47
 
100
- def self.destroy(id)
101
- database.execute "DELETE FROM #{table_name} WHERE id = ?", id
102
- end
103
-
104
- def self.destroy_all
105
- database.execute "DELETE FROM #{table_name}"
48
+ def hash_to_properties(hash)
49
+ hash.each do |column, value|
50
+ instance_variable_set("@#{column}", value)
51
+ end
106
52
  end
107
53
 
108
- def self.row_to_object(row)
109
- model = model_name.new
110
- all_columns.each_with_index do |attribute, index|
111
- model.send("#{attribute}=", row[index])
54
+ def to_hash
55
+ hashed_object = {}
56
+ instance_variables.each do |property|
57
+ hashed_object[property[1..-1].to_sym] =
58
+ instance_variable_get(property.to_s)
112
59
  end
113
- model
60
+ hashed_object
114
61
  end
115
62
  end
116
63
  end
@@ -0,0 +1,20 @@
1
+ module Rollerskates
2
+ module Associable
3
+ def belongs_to(table)
4
+ parent_model = table.to_s.camelize.constantize
5
+ define_method(table) do
6
+ parent_model.find_by(id: send("#{table}_id"))
7
+ end
8
+ end
9
+
10
+ def has_many(table)
11
+ child_model = table.to_s.camelize.constantize
12
+ child_table = table.to_s.pluralize
13
+ parent_model = model_name.to_s.downcase
14
+ define_method(child_table) do
15
+ column = "#{parent_model}_id"
16
+ child_model.where(column => id)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,76 @@
1
+ require "sqlite3"
2
+
3
+ module Rollerskates
4
+ module DatabaseTableHelper
5
+ def table_name
6
+ to_s.downcase.pluralize
7
+ end
8
+
9
+ def database
10
+ @db ||= SQLite3::Database.new File.join("db", "app.db")
11
+ end
12
+
13
+ def model_name
14
+ to_s.downcase
15
+ end
16
+
17
+ def all_columns
18
+ columns = database.prepare "SELECT * FROM #{table_name}"
19
+ columns.columns.map(&:to_sym)
20
+ end
21
+
22
+ private
23
+
24
+ def add_property(property)
25
+ @properties ||= [
26
+ "id integer PRIMARY KEY AUTOINCREMENT",
27
+ "created_at datetime NOT NULL",
28
+ "updated_at datetime NOT NULL"
29
+ ]
30
+ @properties << property
31
+ end
32
+
33
+ def property(field, options)
34
+ add_property "#{field} #{parse_constraints(options)}"
35
+ end
36
+
37
+ def create_table
38
+ query = "CREATE TABLE IF NOT EXISTS #{table_name}\
39
+ (#{@properties.join(', ')})"
40
+ database.execute(query)
41
+
42
+ all_columns.each { |var| attr_accessor var }
43
+ end
44
+
45
+ def parse_constraints(constraints)
46
+ attributes = ""
47
+ constraints.each do |attr, value|
48
+ attributes += send(attr.to_s, value)
49
+ end
50
+
51
+ attributes
52
+ end
53
+
54
+ def type(value)
55
+ "#{value.to_s.upcase} "
56
+ end
57
+
58
+ def primary_key(value)
59
+ return "PRIMARY KEY " if value
60
+ " "
61
+ end
62
+
63
+ def nullable(value)
64
+ return "NOT NULL " if value
65
+ "NULL "
66
+ end
67
+
68
+ def default(value)
69
+ "DEFAULT `#{value}` "
70
+ end
71
+
72
+ def auto_increment(value)
73
+ "AUTOINCREMENT " if value
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,107 @@
1
+ module Rollerskates
2
+ module QueryHelper
3
+ private
4
+
5
+ def table_name
6
+ @model.table_name
7
+ end
8
+
9
+ def database
10
+ @model.database
11
+ end
12
+
13
+ def query_statement
14
+ sql = "#{select_phrase} #{from_phrase}"
15
+ sql << where_phrase unless @columns.empty?
16
+ sql << order_phrase if @order
17
+ sql << limit_phrase if @limit
18
+ sql << offset_phrase if @offset
19
+
20
+ sql
21
+ end
22
+
23
+ def create_columns
24
+ @create_parameters[:created_at] = Time.now.to_s
25
+ @create_parameters[:updated_at] = Time.now.to_s
26
+ @create_parameters.keys.map { |column| "'#{column}'" }.join(", ")
27
+ end
28
+
29
+ def create_values
30
+ @create_parameters.values.map { |value| "'#{value}'" }.join(", ")
31
+ end
32
+
33
+ def update_values
34
+ @update_parameters[:updated_at] = Time.now.to_s
35
+ @update_parameters.map { |key, value| "#{key}" << " = '#{value}'" }
36
+ end
37
+
38
+ def select_phrase
39
+ if @count
40
+ "SELECT COUNT (*)"
41
+ elsif @select
42
+ "SELECT #{@select.flatten.join(', ')} "
43
+ else
44
+ "SELECT * "
45
+ end
46
+ end
47
+
48
+ def from_phrase
49
+ "FROM #{table_name}"
50
+ end
51
+
52
+ def where_phrase
53
+ string = []
54
+ @columns.uniq.each do |col|
55
+ string << col.map { |key, value| "#{key}" << " = '#{value}'" }
56
+ end
57
+ " WHERE #{string.join(' AND ')}" unless @columns.empty?
58
+ end
59
+
60
+ def order_phrase
61
+ " ORDER BY #{@order}" if @order
62
+ end
63
+
64
+ def limit_phrase
65
+ " LIMIT #{@limit}" if @limit
66
+ end
67
+
68
+ def offset_phrase
69
+ " OFFSET #{@offset}" if @offset
70
+ end
71
+
72
+ def execute
73
+ sql = @query ? @query : query_statement
74
+ @result = database.execute sql
75
+ end
76
+
77
+ def data
78
+ execute unless @result
79
+ @data ||= if @type == :collection
80
+ @result.map { |row| row_to_object(row) }
81
+ elsif @type == :object
82
+ row_to_object(@result.flatten)
83
+ end
84
+ end
85
+
86
+ def method_missing(method, *_args)
87
+ if block_given?
88
+ data.each { |object| yield object }
89
+ return true
90
+ end
91
+ data.send(method)
92
+ end
93
+
94
+ def columns
95
+ all_columns = database.prepare query_statement
96
+ all_columns.columns.map(&:to_sym)
97
+ end
98
+
99
+ def row_to_object(row)
100
+ model_object = @model.new
101
+ columns.each_with_index do |attribute, index|
102
+ model_object.send("#{attribute}=", row[index])
103
+ end
104
+ model_object
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,87 @@
1
+ require "rollerskates/orm/helpers/query_helper"
2
+
3
+ module Rollerskates
4
+ class QueryBuilder
5
+ include Rollerskates::QueryHelper
6
+
7
+ def initialize(model)
8
+ @model = model
9
+ @columns = []
10
+ @type = :collection
11
+ end
12
+
13
+ def select(*select_conditions)
14
+ @select = select_conditions
15
+ self
16
+ end
17
+
18
+ def where(where_conditions, object = nil)
19
+ if object
20
+ @type = :object
21
+ limit(1)
22
+ end
23
+
24
+ @columns << where_conditions
25
+ self
26
+ end
27
+
28
+ def first(number = nil)
29
+ @type = :object unless number
30
+ number ? limit(number) : limit(1)
31
+ end
32
+
33
+ def limit(limit_condition = nil)
34
+ @limit = limit_condition if limit_condition
35
+ self
36
+ end
37
+
38
+ def offset(offset_condition)
39
+ @offset = offset_condition if offset_condition
40
+ self
41
+ end
42
+
43
+ def order(order_conditions)
44
+ @order = order_conditions.to_s
45
+ self
46
+ end
47
+
48
+ def count
49
+ @count = true
50
+ execute
51
+ @result.flatten[0].to_i
52
+ end
53
+
54
+ def update(update_parameters)
55
+ @update_parameters = update_parameters
56
+ @query = "UPDATE #{table_name} SET \
57
+ #{update_values.join(', ')} WHERE id = #{id}"
58
+ self
59
+ end
60
+
61
+ def build(create_parameters)
62
+ @create_parameters = create_parameters
63
+ @query = "INSERT INTO #{table_name} (#{create_columns})\
64
+ VALUES (#{create_values})"
65
+ self
66
+ end
67
+
68
+ def destroy(item_id = nil)
69
+ index = item_id ? item_id : id
70
+ @query = "DELETE FROM #{table_name} WHERE id = #{index}"
71
+ execute
72
+ self
73
+ end
74
+
75
+ def destroy_all
76
+ @query = "DELETE FROM #{table_name}"
77
+ execute
78
+ self
79
+ end
80
+
81
+ def save
82
+ @type = :object
83
+ execute
84
+ data
85
+ end
86
+ end
87
+ end
@@ -1,3 +1,3 @@
1
1
  module Rollerskates
2
- VERSION = "0.1.0".freeze
2
+ VERSION = "0.1.1".freeze
3
3
  end
data/rollerskates.gemspec CHANGED
@@ -30,10 +30,12 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency "bundler", "~> 1.9"
31
31
  spec.add_development_dependency "rake", "~> 10.0"
32
32
  spec.add_development_dependency "rspec", "~> 3.0"
33
- spec.add_development_dependency "coveralls"
34
- spec.add_development_dependency "capybara"
33
+ spec.add_development_dependency "coveralls", "~> 0"
34
+ spec.add_development_dependency "capybara", "~> 2.6"
35
35
 
36
36
  spec.add_runtime_dependency "rack", "~> 1.0"
37
- spec.add_runtime_dependency "tilt"
38
- spec.add_runtime_dependency "sqlite3"
37
+ spec.add_runtime_dependency "tilt", "~> 0"
38
+ spec.add_runtime_dependency "pry", "~> 0"
39
+ spec.add_runtime_dependency "sqlite3", "~> 1.3.11"
40
+
39
41
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rollerskates
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Femi Senjobi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-17 00:00:00.000000000 Z
11
+ date: 2016-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -56,30 +56,30 @@ dependencies:
56
56
  name: coveralls
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: capybara
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: '2.6'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: '2.6'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rack
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -98,30 +98,44 @@ dependencies:
98
98
  name: tilt
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ">="
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ">="
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: sqlite3
112
+ name: pry
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ">="
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ">="
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: sqlite3
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 1.3.11
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 1.3.11
125
139
  description: This is a ruby MVC framework to speed up development time.
126
140
  email:
127
141
  - femi.senjobi@andela.com
@@ -148,7 +162,10 @@ files:
148
162
  - lib/rollerskates/base_controller.rb
149
163
  - lib/rollerskates/base_model.rb
150
164
  - lib/rollerskates/dependencies.rb
151
- - lib/rollerskates/helpers/model_helper.rb
165
+ - lib/rollerskates/orm/associable.rb
166
+ - lib/rollerskates/orm/helpers/database_table_helper.rb
167
+ - lib/rollerskates/orm/helpers/query_helper.rb
168
+ - lib/rollerskates/orm/query_builder.rb
152
169
  - lib/rollerskates/routing/mapper.rb
153
170
  - lib/rollerskates/routing/route.rb
154
171
  - lib/rollerskates/routing/router.rb
@@ -1,92 +0,0 @@
1
- require "sqlite3"
2
-
3
- module Rollerskates
4
- class ModelHelper
5
- class << self; attr_accessor :properties, :db; end
6
-
7
- def database
8
- @db ||= SQLite3::Database.new File.join("db", "app.db")
9
- end
10
-
11
- def add_property(property)
12
- self.class.properties ||= [
13
- "id integer PRIMARY KEY AUTOINCREMENT",
14
- "created_at datetime NOT NULL",
15
- "updated_at datetime NOT NULL"
16
- ]
17
- self.class.properties << property
18
- end
19
-
20
- def self.property(field, options)
21
- new.add_property "#{field} #{parse_constraints(options)}"
22
- end
23
-
24
- def self.create_table
25
- query = "CREATE TABLE IF NOT EXISTS #{table_name}\
26
- (#{properties.join(', ')})"
27
- database.execute(query)
28
-
29
- all_columns.each { |var| attr_accessor var }
30
- end
31
-
32
- def self.parse_constraints(constraints)
33
- attributes = ""
34
- constraints.each do |attr, value|
35
- attributes += send(attr.to_s, value)
36
- end
37
-
38
- attributes
39
- end
40
-
41
- def self.type(value)
42
- "#{value.to_s.upcase} "
43
- end
44
-
45
- def self.primary_key(value)
46
- return "PRIMARY KEY " if value
47
- " "
48
- end
49
-
50
- def self.nullable(value)
51
- return "NOT NULL " if value
52
- "NULL "
53
- end
54
-
55
- def self.default(value)
56
- "DEFAULT `#{value}` "
57
- end
58
-
59
- def self.auto_increment(value)
60
- "AUTOINCREMENT " if value
61
- end
62
-
63
- def update_query
64
- "UPDATE #{table_name} SET #{placeholders_for_update} WHERE id = ?"
65
- end
66
-
67
- def table_name
68
- self.class.to_s.downcase.pluralize
69
- end
70
-
71
- def model_name
72
- self.class
73
- end
74
-
75
- def self.method_missing(method, *args)
76
- new.send(method, *args)
77
- end
78
-
79
- def all_columns
80
- @all_columns ||= database.prepare "SELECT * FROM #{table_name}"
81
- @all_columns.columns.map(&:to_sym)
82
- end
83
-
84
- def method_missing(method, *args)
85
- @model.send(method, *args)
86
- end
87
-
88
- def self.all_columns
89
- new.all_columns
90
- end
91
- end
92
- end