mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Special treatement for Relation#select { with block }
This commit is contained in:
parent
0570720d66
commit
4b91daff13
2 changed files with 19 additions and 1 deletions
|
@ -9,7 +9,7 @@ module ActiveRecord
|
|||
(ActiveRecord::Relation::ASSOCIATION_METHODS + ActiveRecord::Relation::MULTI_VALUE_METHODS).each do |query_method|
|
||||
attr_accessor :"#{query_method}_values"
|
||||
|
||||
next if [:where, :having].include?(query_method)
|
||||
next if [:where, :having, :select].include?(query_method)
|
||||
class_eval <<-CEVAL, __FILE__, __LINE__ + 1
|
||||
def #{query_method}(*args, &block)
|
||||
new_relation = clone
|
||||
|
@ -21,6 +21,19 @@ module ActiveRecord
|
|||
CEVAL
|
||||
end
|
||||
|
||||
class_eval <<-CEVAL, __FILE__, __LINE__ + 1
|
||||
def select(*args, &block)
|
||||
if block_given?
|
||||
to_a.select(&block)
|
||||
else
|
||||
new_relation = clone
|
||||
value = Array.wrap(args.flatten).reject {|x| x.blank? }
|
||||
new_relation.select_values += value if value.present?
|
||||
new_relation
|
||||
end
|
||||
end
|
||||
CEVAL
|
||||
|
||||
[:where, :having].each do |query_method|
|
||||
class_eval <<-CEVAL, __FILE__, __LINE__ + 1
|
||||
def #{query_method}(*args, &block)
|
||||
|
|
|
@ -112,6 +112,11 @@ class RelationTest < ActiveRecord::TestCase
|
|||
assert_equal 4, developers.map(&:salary).uniq.size
|
||||
end
|
||||
|
||||
def test_select_with_block
|
||||
even_ids = Developer.scoped.select {|d| d.id % 2 == 0 }.map(&:id)
|
||||
assert_equal [2, 4, 6, 8, 10], even_ids
|
||||
end
|
||||
|
||||
def test_finding_with_hash_conditions_on_joined_table
|
||||
firms = DependentFirm.joins(:account).where({:name => 'RailsCore', :accounts => { :credit_limit => 55..60 }}).to_a
|
||||
assert_equal 1, firms.size
|
||||
|
|
Loading…
Reference in a new issue