Class: RailsConsolePro::QueryBuilder

Inherits:
Object
  • Object
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 relation, return self for chaining
    if result.is_a?(ActiveRecord::Relation) && result.klass == @model_class
      @relation = result
      self
    else
      result
    end
  else
    super
  end
end

Instance Method Details

#analyzeObject

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
    # Return a result with error information
    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

#buildObject

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
    # Return a result with error information
    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

#executeObject

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

Returns:

  • (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_orderObject



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

Chainable query methods



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