aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorDmitry Ratnikov <ratnikov@gmail.com>2009-08-09 03:48:49 -0500
committerJeremy Kemper <jeremy@bitsweat.net>2009-08-09 02:52:06 -0700
commit314ba0433f03b66022ad41d55cc75d2bd9809fe3 (patch)
tree97437c9e2e9e4b1884abd51972f7d78e6218d69c /activerecord
parentf16008afddaf7d80d6bac0ace380e864b78106fe (diff)
downloadrails-314ba0433f03b66022ad41d55cc75d2bd9809fe3.tar.gz
rails-314ba0433f03b66022ad41d55cc75d2bd9809fe3.tar.bz2
rails-314ba0433f03b66022ad41d55cc75d2bd9809fe3.zip
Changed to use klass instead of constantizing in assign_ids generated method
[#260 state:committed] Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
Diffstat (limited to 'activerecord')
-rwxr-xr-xactiverecord/lib/active_record/associations.rb2
-rw-r--r--activerecord/test/cases/modules_test.rb39
2 files changed, 28 insertions, 13 deletions
diff --git a/activerecord/lib/active_record/associations.rb b/activerecord/lib/active_record/associations.rb
index cce7777039..7f299b2aa5 100755
--- a/activerecord/lib/active_record/associations.rb
+++ b/activerecord/lib/active_record/associations.rb
@@ -1367,7 +1367,7 @@ module ActiveRecord
define_method("#{reflection.name.to_s.singularize}_ids=") do |new_value|
ids = (new_value || []).reject { |nid| nid.blank? }
- send("#{reflection.name}=", reflection.class_name.constantize.find(ids))
+ send("#{reflection.name}=", reflection.klass.find(ids))
end
end
end
diff --git a/activerecord/test/cases/modules_test.rb b/activerecord/test/cases/modules_test.rb
index 9c44bea74f..4f559bcaa5 100644
--- a/activerecord/test/cases/modules_test.rb
+++ b/activerecord/test/cases/modules_test.rb
@@ -5,13 +5,20 @@ class ModulesTest < ActiveRecord::TestCase
fixtures :accounts, :companies, :projects, :developers
def setup
- # need to make sure Object::Firm is not defined, so that constantize will not be able to cheat when having to load namespaced classes
- @firm_const = Object.send(:remove_const, :Firm) if Object.const_defined?(:Firm)
+ # need to make sure Object::Firm and Object::Client are not defined,
+ # so that constantize will not be able to cheat when having to load namespaced classes
+ @undefined_consts = {}
+
+ [:Firm, :Client].each do |const|
+ @undefined_consts.merge! const => Object.send(:remove_const, const) if Object.const_defined?(const)
+ end
end
def teardown
- # reinstate the Object::Firm constant for further tests
- Object.send :const_set, :Firm, @firm_const unless @firm_const.nil?
+ # reinstate the constants that we undefined in the setup
+ @undefined_consts.each do |constant, value|
+ Object.send :const_set, constant, value unless value.nil?
+ end
end
def test_module_spanning_associations
@@ -47,17 +54,25 @@ class ModulesTest < ActiveRecord::TestCase
assert_equal 'company_contacts', MyApplication::Business::Client::Contact.table_name, 'table_name for ActiveRecord model enclosed by another ActiveRecord model'
end
+ def test_assign_ids
+ firm = MyApplication::Business::Firm.first
+
+ assert_nothing_raised NameError, "Should be able to resolve all class constants via reflection" do
+ firm.client_ids = [MyApplication::Business::Client.first.id]
+ end
+ end
+
+ # need to add an eager loading condition to force the eager loading model into
+ # the old join model, to test that. See http://dev.rubyonrails.org/ticket/9640
def test_eager_loading_in_modules
- # need to add an eager loading condition to force the eager loading model into
- # the old join model, to test that. See http://dev.rubyonrails.org/ticket/9640
- begin
- client_join_loaded = MyApplication::Business::Client.find(3, :include => {:firm => :account}, :conditions => 'accounts.id IS NOT NULL')
- client_sequential_loaded = MyApplication::Business::Client.find(3, :include => {:firm => :account})
- rescue NameError => nE
- flunk "Should be able to resolve all classes via reflections"
+ clients = []
+
+ assert_nothing_raised NameError, "Should be able to resolve all class constants via reflection" do
+ clients << MyApplication::Business::Client.find(3, :include => {:firm => :account}, :conditions => 'accounts.id IS NOT NULL')
+ clients << MyApplication::Business::Client.find(3, :include => {:firm => :account})
end
- [client_join_loaded, client_sequential_loaded].each do |client|
+ clients.each do |client|
assert_no_queries do
assert_not_nil(client.firm.account)
end