diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2011-02-15 15:52:27 -0800 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2011-02-15 15:52:27 -0800 |
commit | 8276a240207ab6906fa2a6d4635f093906fa3c10 (patch) | |
tree | b1916c9e8651f670985815698a6bc9d27b7aa944 | |
parent | 8c4c07e4cb3ea00767aa584afac9f7730fe2f7b1 (diff) | |
download | rails-8276a240207ab6906fa2a6d4635f093906fa3c10.tar.gz rails-8276a240207ab6906fa2a6d4635f093906fa3c10.tar.bz2 rails-8276a240207ab6906fa2a6d4635f093906fa3c10.zip |
fixture methods can be overridden and super() is useful
-rw-r--r-- | activerecord/lib/active_record/fixtures.rb | 31 | ||||
-rw-r--r-- | activerecord/test/cases/fixtures_test.rb | 15 |
2 files changed, 32 insertions, 14 deletions
diff --git a/activerecord/lib/active_record/fixtures.rb b/activerecord/lib/active_record/fixtures.rb index a5931b2232..b9e591e633 100644 --- a/activerecord/lib/active_record/fixtures.rb +++ b/activerecord/lib/active_record/fixtures.rb @@ -874,28 +874,31 @@ module ActiveRecord def setup_fixture_accessors(fixture_names = nil) fixture_names = Array.wrap(fixture_names || fixture_table_names) - fixture_names.each do |fixture_name| - fixture_name = fixture_name.to_s.tr('./', '_') + methods = Module.new do + fixture_names.each do |fixture_name| + fixture_name = fixture_name.to_s.tr('./', '_') - redefine_method(fixture_name) do |*fixtures| - force_reload = fixtures.pop if fixtures.last == true || fixtures.last == :reload + define_method(fixture_name) do |*fixtures| + force_reload = fixtures.pop if fixtures.last == true || fixtures.last == :reload - @fixture_cache[fixture_name] ||= {} + @fixture_cache[fixture_name] ||= {} - instances = fixtures.map do |fixture| - @fixture_cache[fixture_name].delete(fixture) if force_reload + instances = fixtures.map do |fixture| + @fixture_cache[fixture_name].delete(fixture) if force_reload - if @loaded_fixtures[fixture_name][fixture.to_s] - @fixture_cache[fixture_name][fixture] ||= @loaded_fixtures[fixture_name][fixture.to_s].find - else - raise StandardError, "No fixture with name '#{fixture}' found for table '#{fixture_name}'" + if @loaded_fixtures[fixture_name][fixture.to_s] + @fixture_cache[fixture_name][fixture] ||= @loaded_fixtures[fixture_name][fixture.to_s].find + else + raise StandardError, "No fixture with name '#{fixture}' found for table '#{fixture_name}'" + end end - end - instances.size == 1 ? instances.first : instances + instances.size == 1 ? instances.first : instances + end + private fixture_name end - private fixture_name end + include methods end def uses_transaction(*methods) diff --git a/activerecord/test/cases/fixtures_test.rb b/activerecord/test/cases/fixtures_test.rb index 71303b9c83..fa40fad56d 100644 --- a/activerecord/test/cases/fixtures_test.rb +++ b/activerecord/test/cases/fixtures_test.rb @@ -378,6 +378,21 @@ class ForeignKeyFixturesTest < ActiveRecord::TestCase end end +class OverRideFixtureMethodTest < ActiveRecord::TestCase + fixtures :topics + + def topics(name) + topic = super + topic.title = 'omg' + topic + end + + def test_fixture_methods_can_be_overridden + x = topics :first + assert_equal 'omg', x.title + end +end + class CheckSetTableNameFixturesTest < ActiveRecord::TestCase set_fixture_class :funny_jokes => 'Joke' fixtures :funny_jokes |