Class: RailsConsolePro::QueryBuilder
- Inherits:
-
Object
- Object
- RailsConsolePro::QueryBuilder
show all
- Defined in:
- lib/rails_console_pro/query_builder.rb
Overview
DSL for building and analyzing ActiveRecord queries
Instance Method Summary
collapse
Constructor Details
#initialize(model_class) ⇒ QueryBuilder
Returns a new instance of QueryBuilder.
6
7
8
9
10
11
12
|
# File 'lib/rails_console_pro/query_builder.rb', line 6
def initialize(model_class)
unless model_class.respond_to?(:all)
raise ArgumentError, "#{model_class} is not an ActiveRecord model"
end
@model_class = model_class
@relation = model_class.all
end
|
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_name, *args, **kwargs, &block) ⇒ Object
Delegate other methods to the relation
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
# File 'lib/rails_console_pro/query_builder.rb', line 166
def method_missing(method_name, *args, **kwargs, &block)
if @relation.respond_to?(method_name)
result = @relation.public_send(method_name, *args, **kwargs, &block)
if result.is_a?(ActiveRecord::Relation) && result.klass == @model_class
@relation = result
self
else
result
end
else
super
end
end
|
Instance Method Details
#analyze ⇒ Object
Analyze the query (returns QueryBuilderResult with explain)
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
# File 'lib/rails_console_pro/query_builder.rb', line 116
def analyze
begin
sql = @relation.to_sql
statistics = build_statistics
result = QueryBuilderResult.new(
relation: @relation,
sql: sql,
statistics: statistics,
model_class: @model_class
)
result.analyze
rescue => e
QueryBuilderResult.new(
relation: @relation,
sql: nil,
statistics: { "Model" => @model_class.name, "Table" => @model_class.table_name, "Error" => e.message },
model_class: @model_class
)
end
end
|
#build ⇒ Object
Build the query and return result without explain
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
# File 'lib/rails_console_pro/query_builder.rb', line 139
def build
begin
sql = @relation.to_sql
statistics = build_statistics
QueryBuilderResult.new(
relation: @relation,
sql: sql,
statistics: statistics,
model_class: @model_class
)
rescue => e
QueryBuilderResult.new(
relation: @relation,
sql: nil,
statistics: { "Model" => @model_class.name, "Table" => @model_class.table_name, "Error" => e.message },
model_class: @model_class
)
end
end
|
#distinct(value = true) ⇒ Object
80
81
82
83
|
# File 'lib/rails_console_pro/query_builder.rb', line 80
def distinct(value = true)
@relation = @relation.distinct(value)
self
end
|
#eager_load(*args) ⇒ Object
30
31
32
33
|
# File 'lib/rails_console_pro/query_builder.rb', line 30
def eager_load(*args)
@relation = @relation.eager_load(*args)
self
end
|
#execute ⇒ Object
Execute the query and return the relation
161
162
163
|
# File 'lib/rails_console_pro/query_builder.rb', line 161
def execute
@relation
end
|
#group(*args) ⇒ Object
70
71
72
73
|
# File 'lib/rails_console_pro/query_builder.rb', line 70
def group(*args)
@relation = @relation.group(*args)
self
end
|
#having(*args) ⇒ Object
75
76
77
78
|
# File 'lib/rails_console_pro/query_builder.rb', line 75
def having(*args)
@relation = @relation.having(*args)
self
end
|
#includes(*args) ⇒ Object
20
21
22
23
|
# File 'lib/rails_console_pro/query_builder.rb', line 20
def includes(*args)
@relation = @relation.includes(*args)
self
end
|
#joins(*args) ⇒ Object
35
36
37
38
|
# File 'lib/rails_console_pro/query_builder.rb', line 35
def joins(*args)
@relation = @relation.joins(*args)
self
end
|
#left_joins(*args) ⇒ Object
40
41
42
43
|
# File 'lib/rails_console_pro/query_builder.rb', line 40
def left_joins(*args)
@relation = @relation.left_joins(*args)
self
end
|
#left_outer_joins(*args) ⇒ Object
45
46
47
48
|
# File 'lib/rails_console_pro/query_builder.rb', line 45
def left_outer_joins(*args)
@relation = @relation.left_outer_joins(*args)
self
end
|
#limit(value) ⇒ Object
60
61
62
63
|
# File 'lib/rails_console_pro/query_builder.rb', line 60
def limit(value)
@relation = @relation.limit(value)
self
end
|
#lock(locks = true) ⇒ Object
90
91
92
93
|
# File 'lib/rails_console_pro/query_builder.rb', line 90
def lock(locks = true)
@relation = @relation.lock(locks)
self
end
|
#offset(value) ⇒ Object
65
66
67
68
|
# File 'lib/rails_console_pro/query_builder.rb', line 65
def offset(value)
@relation = @relation.offset(value)
self
end
|
#order(*args) ⇒ Object
55
56
57
58
|
# File 'lib/rails_console_pro/query_builder.rb', line 55
def order(*args)
@relation = @relation.order(*args)
self
end
|
#preload(*args) ⇒ Object
25
26
27
28
|
# File 'lib/rails_console_pro/query_builder.rb', line 25
def preload(*args)
@relation = @relation.preload(*args)
self
end
|
#readonly(value = true) ⇒ Object
85
86
87
88
|
# File 'lib/rails_console_pro/query_builder.rb', line 85
def readonly(value = true)
@relation = @relation.readonly(value)
self
end
|
#reorder(*args) ⇒ Object
95
96
97
98
|
# File 'lib/rails_console_pro/query_builder.rb', line 95
def reorder(*args)
@relation = @relation.reorder(*args)
self
end
|
#respond_to_missing?(method_name, include_private = false) ⇒ Boolean
181
182
183
|
# File 'lib/rails_console_pro/query_builder.rb', line 181
def respond_to_missing?(method_name, include_private = false)
@relation.respond_to?(method_name, include_private) || super
end
|
#reverse_order ⇒ Object
100
101
102
103
|
# File 'lib/rails_console_pro/query_builder.rb', line 100
def reverse_order
@relation = @relation.reverse_order
self
end
|
#rewhere(conditions) ⇒ Object
110
111
112
113
|
# File 'lib/rails_console_pro/query_builder.rb', line 110
def rewhere(conditions)
@relation = @relation.rewhere(conditions)
self
end
|
#select(*args) ⇒ Object
50
51
52
53
|
# File 'lib/rails_console_pro/query_builder.rb', line 50
def select(*args)
@relation = @relation.select(*args)
self
end
|
#unscope(*args) ⇒ Object
105
106
107
108
|
# File 'lib/rails_console_pro/query_builder.rb', line 105
def unscope(*args)
@relation = @relation.unscope(*args)
self
end
|
#where(*args, **kwargs) ⇒ Object
15
16
17
18
|
# File 'lib/rails_console_pro/query_builder.rb', line 15
def where(*args, **kwargs)
@relation = @relation.where(*args, **kwargs)
self
end
|