Method: ActiveRecord::QueryMethods#select

Defined in:
lib/active_record/relation/query_methods.rb

#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