Skip to content

Commit

Permalink
Add ActiveRecord::Base.sti_name that checks ActiveRecord::Base#store_…
Browse files Browse the repository at this point in the history
…full_sti_class? and returns either the full or demodulized name. [rick] [#114 state:resolved]
  • Loading branch information
technoweenie committed Jun 1, 2008
1 parent a6e7908 commit 72483c0
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 6 deletions.
2 changes: 2 additions & 0 deletions activerecord/CHANGELOG
@@ -1,3 +1,5 @@
* Add ActiveRecord::Base.sti_name that checks ActiveRecord::Base#store_full_sti_class? and returns either the full or demodulized name. [rick]

* Add first/last methods to associations/named_scope. Resolved #226. [Ryan Bates]

*2.1.0 RC1 (May 11th, 2008)*
Expand Down
Expand Up @@ -237,7 +237,7 @@ def build_through_conditions
end

def build_sti_condition
"#{@reflection.through_reflection.quoted_table_name}.#{@reflection.through_reflection.klass.inheritance_column} = #{@reflection.klass.quote_value(@reflection.through_reflection.klass.name.demodulize)}"
"#{@reflection.through_reflection.quoted_table_name}.#{@reflection.through_reflection.klass.inheritance_column} = #{@reflection.klass.quote_value(@reflection.through_reflection.klass.sti_name)}"
end

alias_method :sql_conditions, :conditions
Expand Down
16 changes: 12 additions & 4 deletions activerecord/lib/active_record/base.rb
Expand Up @@ -1293,6 +1293,10 @@ def respond_to?(method_id, include_private = false)
super
end

def sti_name
store_full_sti_class ? name : name.demodulize
end

private
def find_initial(options)
options.update(:limit => 1)
Expand Down Expand Up @@ -1452,7 +1456,11 @@ def instantiate(record)
# Nest the type name in the same module as this class.
# Bar is "MyApp::Business::Bar" relative to MyApp::Business::Foo
def type_name_with_module(type_name)
(/^::/ =~ type_name) ? type_name : "#{parent.name}::#{type_name}"
if store_full_sti_class
type_name
else
(/^::/ =~ type_name) ? type_name : "#{parent.name}::#{type_name}"
end
end

def construct_finder_sql(options)
Expand Down Expand Up @@ -1571,8 +1579,8 @@ def add_conditions!(sql, conditions, scope = :auto)

def type_condition
quoted_inheritance_column = connection.quote_column_name(inheritance_column)
type_condition = subclasses.inject("#{quoted_table_name}.#{quoted_inheritance_column} = '#{store_full_sti_class ? name : name.demodulize}' ") do |condition, subclass|
condition << "OR #{quoted_table_name}.#{quoted_inheritance_column} = '#{store_full_sti_class ? subclass.name : subclass.name.demodulize}' "
type_condition = subclasses.inject("#{quoted_table_name}.#{quoted_inheritance_column} = '#{sti_name}' ") do |condition, subclass|
condition << "OR #{quoted_table_name}.#{quoted_inheritance_column} = '#{subclass.sti_name}' "
end

" (#{type_condition}) "
Expand Down Expand Up @@ -2508,7 +2516,7 @@ def create
# Message class in that example.
def ensure_proper_type
unless self.class.descends_from_active_record?
write_attribute(self.class.inheritance_column, store_full_sti_class ? self.class.name : self.class.name.demodulize)
write_attribute(self.class.inheritance_column, self.class.sti_name)
end
end

Expand Down
18 changes: 17 additions & 1 deletion activerecord/test/cases/inheritance_test.rb
Expand Up @@ -5,7 +5,23 @@

class InheritanceTest < ActiveRecord::TestCase
fixtures :companies, :projects, :subscribers, :accounts


def test_class_with_store_full_sti_class_returns_full_name
old = ActiveRecord::Base.store_full_sti_class
ActiveRecord::Base.store_full_sti_class = true
assert_equal 'Namespaced::Company', Namespaced::Company.sti_name
ensure
ActiveRecord::Base.store_full_sti_class = old
end

def test_class_without_store_full_sti_class_returns_demodulized_name
old = ActiveRecord::Base.store_full_sti_class
ActiveRecord::Base.store_full_sti_class = false
assert_equal 'Company', Namespaced::Company.sti_name
ensure
ActiveRecord::Base.store_full_sti_class = old
end

def test_should_store_demodulized_class_name_with_store_full_sti_class_option_disabled
old = ActiveRecord::Base.store_full_sti_class
ActiveRecord::Base.store_full_sti_class = false
Expand Down

0 comments on commit 72483c0

Please sign in to comment.