From 01ede9a211d91d415488d42ff8015809de2ac497 Mon Sep 17 00:00:00 2001 From: Guillermo Iguaran Date: Sat, 10 Mar 2012 19:39:13 -0500 Subject: Add ActiveRecord::Base#slice to slice method calls --- activerecord/lib/active_record/core.rb | 6 ++++++ activerecord/test/cases/base_test.rb | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb index 9a2f859fc7..76c424e8b4 100644 --- a/activerecord/lib/active_record/core.rb +++ b/activerecord/lib/active_record/core.rb @@ -1,4 +1,5 @@ require 'active_support/concern' +require 'active_support/core_ext/hash/indifferent_access' require 'thread' module ActiveRecord @@ -326,6 +327,11 @@ module ActiveRecord "#<#{self.class} #{inspection}>" end + # Returns a hash of the given methods with their names as keys and returned values as values. + def slice(*methods) + Hash[methods.map { |method| [method, public_send(method)] }].with_indifferent_access + end + private # Under Ruby 1.9, Array#flatten will call #to_ary (recursively) on each of the elements diff --git a/activerecord/test/cases/base_test.rb b/activerecord/test/cases/base_test.rb index ff39285f62..f0fbca190c 100644 --- a/activerecord/test/cases/base_test.rb +++ b/activerecord/test/cases/base_test.rb @@ -2057,4 +2057,16 @@ class BasicsTest < ActiveRecord::TestCase def test_typecasting_aliases assert_equal 10, Topic.select('10 as tenderlove').first.tenderlove end + + def test_slice + company = Company.new(:rating => 1, :name => "37signals", :firm_name => "37signals") + hash = company.slice(:name, :rating, "arbitrary_method") + assert_equal hash[:name], company.name + assert_equal hash['name'], company.name + assert_equal hash[:rating], company.rating + assert_equal hash['arbitrary_method'], company.arbitrary_method + assert_equal hash[:arbitrary_method], company.arbitrary_method + assert_nil hash[:firm_name] + assert_nil hash['firm_name'] + end end -- cgit v1.2.3 From bb2e2d8cb6fda1a093925fb6f79ef44f404bf785 Mon Sep 17 00:00:00 2001 From: Guillermo Iguaran Date: Thu, 29 Mar 2012 16:36:04 -0500 Subject: CHANGELOG entry for AR#slice --- activerecord/CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 46031e7c13..1d5b8841e2 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,5 +1,10 @@ ## Rails 4.0.0 (unreleased) ## +* Added ActiveRecord::Base#slice to return a hash of the given methods with + their names as keys and returned values as values. + + *Guillermo Iguaran* + * Deprecate eager-evaluated scopes. Don't use this: -- cgit v1.2.3