1
0
Fork 0
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:
Pratik Naik 2010-06-02 14:42:25 +01:00
parent 0570720d66
commit 4b91daff13
2 changed files with 19 additions and 1 deletions

View file

@ -9,7 +9,7 @@ module ActiveRecord
(ActiveRecord::Relation::ASSOCIATION_METHODS + ActiveRecord::Relation::MULTI_VALUE_METHODS).each do |query_method| (ActiveRecord::Relation::ASSOCIATION_METHODS + ActiveRecord::Relation::MULTI_VALUE_METHODS).each do |query_method|
attr_accessor :"#{query_method}_values" 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 class_eval <<-CEVAL, __FILE__, __LINE__ + 1
def #{query_method}(*args, &block) def #{query_method}(*args, &block)
new_relation = clone new_relation = clone
@ -21,6 +21,19 @@ module ActiveRecord
CEVAL CEVAL
end 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| [:where, :having].each do |query_method|
class_eval <<-CEVAL, __FILE__, __LINE__ + 1 class_eval <<-CEVAL, __FILE__, __LINE__ + 1
def #{query_method}(*args, &block) def #{query_method}(*args, &block)

View file

@ -112,6 +112,11 @@ class RelationTest < ActiveRecord::TestCase
assert_equal 4, developers.map(&:salary).uniq.size assert_equal 4, developers.map(&:salary).uniq.size
end 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 def test_finding_with_hash_conditions_on_joined_table
firms = DependentFirm.joins(:account).where({:name => 'RailsCore', :accounts => { :credit_limit => 55..60 }}).to_a firms = DependentFirm.joins(:account).where({:name => 'RailsCore', :accounts => { :credit_limit => 55..60 }}).to_a
assert_equal 1, firms.size assert_equal 1, firms.size