Module: ActiveRecord::QueryMethods
- Extended by:
- ActiveSupport::Concern
- Included in:
- Relation
- Defined in:
- lib/active_record/relation/query_methods.rb
Instance Attribute Summary collapse
-
#bind_values ⇒ Object
Returns the value of attribute bind_values.
-
#create_with_value ⇒ Object
Returns the value of attribute create_with_value.
-
#eager_load_values ⇒ Object
Returns the value of attribute eager_load_values.
-
#from_value ⇒ Object
Returns the value of attribute from_value.
-
#group_values ⇒ Object
Returns the value of attribute group_values.
-
#having_values ⇒ Object
Returns the value of attribute having_values.
-
#includes_values ⇒ Object
Returns the value of attribute includes_values.
-
#joins_values ⇒ Object
Returns the value of attribute joins_values.
-
#limit_value ⇒ Object
Returns the value of attribute limit_value.
-
#lock_value ⇒ Object
Returns the value of attribute lock_value.
-
#offset_value ⇒ Object
Returns the value of attribute offset_value.
-
#order_values ⇒ Object
Returns the value of attribute order_values.
-
#preload_values ⇒ Object
Returns the value of attribute preload_values.
-
#readonly_value ⇒ Object
Returns the value of attribute readonly_value.
-
#reordering_value ⇒ Object
Returns the value of attribute reordering_value.
-
#reverse_order_value ⇒ Object
Returns the value of attribute reverse_order_value.
-
#select_values ⇒ Object
Returns the value of attribute select_values.
-
#uniq_value ⇒ Object
Returns the value of attribute uniq_value.
-
#where_values ⇒ Object
Returns the value of attribute where_values.
Instance Method Summary collapse
- #arel ⇒ Object
- #bind(value) ⇒ Object
- #build_arel ⇒ Object
- #create_with(value) ⇒ Object
- #eager_load(*args) ⇒ Object
-
#extending(*modules) ⇒ Object
Used to extend a scope with additional methods, either through a module or through a block provided.
- #from(value) ⇒ Object
- #group(*args) ⇒ Object
- #having(opts, *rest) ⇒ Object
- #includes(*args) ⇒ Object
- #joins(*args) ⇒ Object
- #limit(value) ⇒ Object
- #lock(locks = true) ⇒ Object
- #offset(value) ⇒ Object
- #order(*args) ⇒ Object
- #preload(*args) ⇒ Object
- #readonly(value = true) ⇒ Object
-
#reorder(*args) ⇒ Object
Replaces any existing order defined on the relation with the specified order.
- #reverse_order ⇒ Object
-
#select(value = Proc.new) ⇒ Object
Works in two unique ways.
-
#uniq(value = true) ⇒ Object
Specifies whether the records should be unique or not.
- #where(opts, *rest) ⇒ Object
Instance Attribute Details
#bind_values ⇒ Object
Returns the value of attribute bind_values.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def bind_values @bind_values end |
#create_with_value ⇒ Object
Returns the value of attribute create_with_value.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def create_with_value @create_with_value end |
#eager_load_values ⇒ Object
Returns the value of attribute eager_load_values.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def eager_load_values @eager_load_values end |
#from_value ⇒ Object
Returns the value of attribute from_value.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def from_value @from_value end |
#group_values ⇒ Object
Returns the value of attribute group_values.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def group_values @group_values end |
#having_values ⇒ Object
Returns the value of attribute having_values.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def having_values @having_values end |
#includes_values ⇒ Object
Returns the value of attribute includes_values.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def includes_values @includes_values end |
#joins_values ⇒ Object
Returns the value of attribute joins_values.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def joins_values @joins_values end |
#limit_value ⇒ Object
Returns the value of attribute limit_value.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def limit_value @limit_value end |
#lock_value ⇒ Object
Returns the value of attribute lock_value.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def lock_value @lock_value end |
#offset_value ⇒ Object
Returns the value of attribute offset_value.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def offset_value @offset_value end |
#order_values ⇒ Object
Returns the value of attribute order_values.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def order_values @order_values end |
#preload_values ⇒ Object
Returns the value of attribute preload_values.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def preload_values @preload_values end |
#readonly_value ⇒ Object
Returns the value of attribute readonly_value.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def readonly_value @readonly_value end |
#reordering_value ⇒ Object
Returns the value of attribute reordering_value.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def reordering_value @reordering_value end |
#reverse_order_value ⇒ Object
Returns the value of attribute reverse_order_value.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def reverse_order_value @reverse_order_value end |
#select_values ⇒ Object
Returns the value of attribute select_values.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def select_values @select_values end |
#uniq_value ⇒ Object
Returns the value of attribute uniq_value.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def uniq_value @uniq_value end |
#where_values ⇒ Object
Returns the value of attribute where_values.
8 9 10 |
# File 'lib/active_record/relation/query_methods.rb', line 8 def where_values @where_values end |
Instance Method Details
#arel ⇒ Object
259 260 261 |
# File 'lib/active_record/relation/query_methods.rb', line 259 def arel @arel ||= with_default_scope.build_arel end |
#bind(value) ⇒ Object
126 127 128 129 130 |
# File 'lib/active_record/relation/query_methods.rb', line 126 def bind(value) relation = clone relation.bind_values += [value] relation end |
#build_arel ⇒ Object
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 |
# File 'lib/active_record/relation/query_methods.rb', line 263 def build_arel arel = table.from table build_joins(arel, @joins_values) unless @joins_values.empty? collapse_wheres(arel, (@where_values - ['']).uniq) arel.having(*@having_values.uniq.reject{|h| h.blank?}) unless @having_values.empty? arel.take(connection.sanitize_limit(@limit_value)) if @limit_value arel.skip(@offset_value.to_i) if @offset_value arel.group(*@group_values.uniq.reject{|g| g.blank?}) unless @group_values.empty? order = @order_values order = reverse_sql_order(order) if @reverse_order_value arel.order(*order.uniq.reject{|o| o.blank?}) unless order.empty? build_select(arel, @select_values.uniq) arel.distinct(@uniq_value) arel.from(@from_value) if @from_value arel.lock(@lock_value) if @lock_value arel end |
#create_with(value) ⇒ Object
179 180 181 182 183 |
# File 'lib/active_record/relation/query_methods.rb', line 179 def create_with(value) relation = clone relation.create_with_value = value ? create_with_value.merge(value) : {} relation end |
#eager_load(*args) ⇒ Object
25 26 27 28 29 30 31 |
# File 'lib/active_record/relation/query_methods.rb', line 25 def eager_load(*args) return self if args.blank? relation = clone relation.eager_load_values += args relation end |
#extending(*modules) ⇒ Object
Used to extend a scope with additional methods, either through a module or through a block provided.
The object returned is a relation, which can be further extended.
Using a module
module Pagination
def page(number)
# pagination code goes here
end
end
scope = Model.scoped.extending(Pagination)
scope.page(params[:page])
You can also pass a list of modules:
scope = Model.scoped.extending(Pagination, SomethingElse)
Using a block
scope = Model.scoped.extending do
def page(number)
# pagination code goes here
end
end
scope.page(params[:page])
You can also use a block and a module list:
scope = Model.scoped.extending(Pagination) do
def per_page(number)
# pagination code goes here
end
end
243 244 245 246 247 248 249 250 251 |
# File 'lib/active_record/relation/query_methods.rb', line 243 def extending(*modules) modules << Module.new(&Proc.new) if block_given? return self if modules.empty? relation = clone relation.send(:apply_modules, modules.flatten) relation end |
#from(value) ⇒ Object
185 186 187 188 189 |
# File 'lib/active_record/relation/query_methods.rb', line 185 def from(value) relation = clone relation.from_value = value relation end |
#group(*args) ⇒ Object
80 81 82 83 84 85 86 |
# File 'lib/active_record/relation/query_methods.rb', line 80 def group(*args) return self if args.blank? relation = clone relation.group_values += args.flatten relation end |
#having(opts, *rest) ⇒ Object
140 141 142 143 144 145 146 |
# File 'lib/active_record/relation/query_methods.rb', line 140 def having(opts, *rest) return self if opts.blank? relation = clone relation.having_values += build_where(opts, rest) relation end |
#includes(*args) ⇒ Object
15 16 17 18 19 20 21 22 23 |
# File 'lib/active_record/relation/query_methods.rb', line 15 def includes(*args) args.reject! {|a| a.blank? } return self if args.empty? relation = clone relation.includes_values = (relation.includes_values + args).flatten.uniq relation end |
#joins(*args) ⇒ Object
115 116 117 118 119 120 121 122 123 124 |
# File 'lib/active_record/relation/query_methods.rb', line 115 def joins(*args) return self if args.compact.blank? relation = clone args.flatten! relation.joins_values += args relation end |
#limit(value) ⇒ Object
148 149 150 151 152 |
# File 'lib/active_record/relation/query_methods.rb', line 148 def limit(value) relation = clone relation.limit_value = value relation end |
#lock(locks = true) ⇒ Object
160 161 162 163 164 165 166 167 168 169 170 171 |
# File 'lib/active_record/relation/query_methods.rb', line 160 def lock(locks = true) relation = clone case locks when String, TrueClass, NilClass relation.lock_value = locks || true else relation.lock_value = false end relation end |
#offset(value) ⇒ Object
154 155 156 157 158 |
# File 'lib/active_record/relation/query_methods.rb', line 154 def offset(value) relation = clone relation.offset_value = value relation end |
#order(*args) ⇒ Object
88 89 90 91 92 93 94 |
# File 'lib/active_record/relation/query_methods.rb', line 88 def order(*args) return self if args.blank? relation = clone relation.order_values += args.flatten relation end |
#preload(*args) ⇒ Object
33 34 35 36 37 38 39 |
# File 'lib/active_record/relation/query_methods.rb', line 33 def preload(*args) return self if args.blank? relation = clone relation.preload_values += args relation end |
#readonly(value = true) ⇒ Object
173 174 175 176 177 |
# File 'lib/active_record/relation/query_methods.rb', line 173 def readonly(value = true) relation = clone relation.readonly_value = value relation end |
#reorder(*args) ⇒ Object
Replaces any existing order defined on the relation with the specified order.
User.order('email DESC').reorder('id ASC') # generated SQL has 'ORDER BY id ASC'
Subsequent calls to order on the same relation will be appended. For example:
User.order('email DESC').reorder('id ASC').order('name ASC')
generates a query with ‘ORDER BY id ASC, name ASC’.
106 107 108 109 110 111 112 113 |
# File 'lib/active_record/relation/query_methods.rb', line 106 def reorder(*args) return self if args.blank? relation = clone relation.reordering_value = true relation.order_values = args.flatten relation end |
#reverse_order ⇒ Object
253 254 255 256 257 |
# File 'lib/active_record/relation/query_methods.rb', line 253 def reverse_order relation = clone relation.reverse_order_value = !relation.reverse_order_value relation end |
#select(value = Proc.new) ⇒ Object
Works in two unique ways.
First: takes a block so it can be used just like Array#select.
Model.scoped.select { |m| m.field == value }
This will build an array of objects from the database for the scope, converting them into an array and iterating through them using Array#select.
Second: Modifies the SELECT statement for the query so that only certain fields are retrieved:
>> Model.select(:field)
=> [#<Model field:value>]
Although in the above example it looks as though this method returns an array, it actually returns a relation object and can have other query methods appended to it, such as the other methods in ActiveRecord::QueryMethods.
The argument to the method can also be an array of fields.
>> Model.select([:field, :other_field, :and_one_more])
=> [#<Model field: "value", other_field: "value", and_one_more: "value">]
Any attributes that do not have fields retrieved by a select will raise a ActiveModel::MissingAttributeError when the getter method for that attribute is used:
>> Model.select(:field).first.other_field
=> ActiveModel::MissingAttributeError: missing attribute: other_field
70 71 72 73 74 75 76 77 78 |
# File 'lib/active_record/relation/query_methods.rb', line 70 def select(value = Proc.new) if block_given? to_a.select {|*block_args| value.call(*block_args) } else relation = clone relation.select_values += Array.wrap(value) relation end end |
#uniq(value = true) ⇒ Object
Specifies whether the records should be unique or not. For example:
User.select(:name)
# => Might return two records with the same name
User.select(:name).uniq
# => Returns 1 record per unique name
User.select(:name).uniq.uniq(false)
# => You can also remove the uniqueness
201 202 203 204 205 |
# File 'lib/active_record/relation/query_methods.rb', line 201 def uniq(value = true) relation = clone relation.uniq_value = value relation end |
#where(opts, *rest) ⇒ Object
132 133 134 135 136 137 138 |
# File 'lib/active_record/relation/query_methods.rb', line 132 def where(opts, *rest) return self if opts.blank? relation = clone relation.where_values += build_where(opts, rest) relation end |