diff --git a/lib/groupdate.rb b/lib/groupdate.rb index eb83b7e..3804556 100644 --- a/lib/groupdate.rb +++ b/lib/groupdate.rb @@ -1,5 +1,15 @@ require "active_support/time" require "groupdate/version" + +module Groupdate + FIELDS = [:second, :minute, :hour, :day, :week, :month, :year, :day_of_week, :hour_of_day] + METHODS = FIELDS.map{|v| :"group_by_#{v}" } + + mattr_accessor :week_start, :day_start, :time_zone + self.week_start = :sun + self.day_start = 0 +end + require "groupdate/magic" begin require "active_record" @@ -8,9 +18,3 @@ rescue LoadError end require "groupdate/active_record" if defined?(ActiveRecord) require "groupdate/enumerable" - -module Groupdate - mattr_accessor :week_start, :day_start, :time_zone - self.week_start = :sun - self.day_start = 0 -end diff --git a/lib/groupdate/active_record.rb b/lib/groupdate/active_record.rb index 0b04f33..a56ceb9 100644 --- a/lib/groupdate/active_record.rb +++ b/lib/groupdate/active_record.rb @@ -3,6 +3,25 @@ require "groupdate/scopes" ActiveRecord::Base.send(:extend, Groupdate::Scopes) +module ActiveRecord + class Relation + + if ActiveRecord::VERSION::MAJOR == 3 and ActiveRecord::VERSION::MINOR < 2 + + def method_missing_with_hack(method, *args, &block) + if Groupdate::METHODS.include?(method) + scoping { @klass.send(method, *args, &block) } + else + method_missing_without_hack(method, *args, &block) + end + end + alias_method_chain :method_missing, :hack + + end + + end +end + # hack for **unfixed** rails issue # https://github.com/rails/rails/issues/7121 module ActiveRecord diff --git a/lib/groupdate/enumerable.rb b/lib/groupdate/enumerable.rb index 93e18b1..250b9e8 100644 --- a/lib/groupdate/enumerable.rb +++ b/lib/groupdate/enumerable.rb @@ -1,11 +1,8 @@ module Enumerable - # skip due to ActiveRecord bug - unless defined?(ActiveRecord) and ActiveRecord::VERSION::MAJOR == 3 and ActiveRecord::VERSION::MINOR < 2 - [:second, :minute, :hour, :day, :week, :month, :year, :day_of_week, :hour_of_day].each do |field| - define_method :"group_by_#{field}" do |options = {}, &block| - Groupdate::Magic.new(field, options).group_by(self, &block) - end + Groupdate::FIELDS.each do |field| + define_method :"group_by_#{field}" do |options = {}, &block| + Groupdate::Magic.new(field, options).group_by(self, &block) end end diff --git a/lib/groupdate/scopes.rb b/lib/groupdate/scopes.rb index 12cb04f..e6e38b4 100644 --- a/lib/groupdate/scopes.rb +++ b/lib/groupdate/scopes.rb @@ -5,7 +5,7 @@ require "active_record" module Groupdate module Scopes - [:second, :minute, :hour, :day, :week, :month, :year, :day_of_week, :hour_of_day].each do |field| + Groupdate::FIELDS.each do |field| define_method :"group_by_#{field}" do |*args| args = args.dup options = args[-1].is_a?(Hash) ? args.pop : {} diff --git a/test/enumerable_test.rb b/test/enumerable_test.rb index 722ef8d..4d534e5 100644 --- a/test/enumerable_test.rb +++ b/test/enumerable_test.rb @@ -1,23 +1,21 @@ require_relative "test_helper" -unless ActiveRecord::VERSION::MAJOR == 3 and ActiveRecord::VERSION::MINOR < 2 - class TestEnumerable < Minitest::Unit::TestCase - include TestGroupdate +class TestEnumerable < Minitest::Unit::TestCase + include TestGroupdate - def test_enumerable - user_a = User.new(created_at: utc.parse("2014-01-21")) - user_b = User.new(created_at: utc.parse("2014-03-14")) - expected = { - utc.parse("2014-01-01") => [user_a], - utc.parse("2014-02-01") => [], - utc.parse("2014-03-01") => [user_b] - } - assert_equal expected, [user_a, user_b].group_by_month(&:created_at) - end - - def call_method(method, field, options) - Hash[ User.all.to_a.send(:"group_by_#{method}", options){|u| u.send(field) }.map{|k, v| [k, v.size] } ] - end + def test_enumerable + user_a = User.new(created_at: utc.parse("2014-01-21")) + user_b = User.new(created_at: utc.parse("2014-03-14")) + expected = { + utc.parse("2014-01-01") => [user_a], + utc.parse("2014-02-01") => [], + utc.parse("2014-03-01") => [user_b] + } + assert_equal expected, [user_a, user_b].group_by_month(&:created_at) + end + def call_method(method, field, options) + Hash[ User.all.to_a.send(:"group_by_#{method}", options){|u| u.send(field) }.map{|k, v| [k, v.size] } ] end + end -- libgit2 0.21.0