提交 0d9f45ff 编写于 作者: B Bogdan Gusiev

Add AR::Base.base_class? predicate

上级 09b2348f
* Add `AR::Base.base_class?` predicate
*Bogdan Gusiev*
* Add custom prefix option to ActiveRecord::Store.store_accessor.
*Tan Huynh*
......
......@@ -59,7 +59,7 @@ def define_attribute_methods # :nodoc:
# attribute methods.
generated_attribute_methods.synchronize do
return false if @attribute_methods_generated
superclass.define_attribute_methods unless self == base_class
superclass.define_attribute_methods unless base_class?
super(attribute_names)
@attribute_methods_generated = true
end
......
......@@ -83,7 +83,7 @@ def quoted_primary_key
end
def reset_primary_key #:nodoc:
if self == base_class
if base_class?
self.primary_key = get_primary_key(base_class.name)
else
self.primary_key = base_class.primary_key
......
......@@ -55,7 +55,7 @@ def new(attributes = nil, &block)
if has_attribute?(inheritance_column)
subclass = subclass_from_attributes(attributes)
if subclass.nil? && base_class == self
if subclass.nil? && base_class?
subclass = subclass_from_attributes(column_defaults)
end
end
......@@ -104,6 +104,12 @@ def base_class
end
end
# Returns whether the class is a base class.
# See #base_class for more information.
def base_class?
base_class == self
end
# Set this to +true+ if this is an abstract class (see
# <tt>abstract_class?</tt>).
# If you are using inheritance with Active Record and don't want a class
......
......@@ -276,7 +276,7 @@ def ignored_columns=(columns)
end
def sequence_name
if base_class == self
if base_class?
@sequence_name ||= reset_sequence_name
else
(@sequence_name ||= nil) || base_class.sequence_name
......@@ -501,8 +501,7 @@ def undecorated_table_name(class_name = base_class.name)
# Computes and returns a table name according to default conventions.
def compute_table_name
base = base_class
if self == base
if base_class?
# Nested classes are prefixed with singular parent table name.
if parent < Base && !parent.abstract_class?
contained = parent.table_name
......@@ -513,7 +512,7 @@ def compute_table_name
"#{full_table_name_prefix}#{contained}#{undecorated_table_name(name)}#{full_table_name_suffix}"
else
# STI subclasses always use their superclass' table.
base.table_name
base_class.table_name
end
end
end
......
......@@ -10,7 +10,7 @@ def lookup_ancestors #:nodoc:
classes = [klass]
return classes if klass == ActiveRecord::Base
while klass != klass.base_class
while !klass.base_class?
classes << klass = klass.superclass
end
classes
......
......@@ -12,7 +12,7 @@ def type; :integer; end
def setup
@klass = Class.new(Class.new { def self.initialize_generated_modules; end }) do
def self.superclass; Base; end
def self.base_class; self; end
def self.base_class?; true; end
def self.decorate_matching_attribute_types(*); end
include ActiveRecord::DefineCallbacks
......
......@@ -174,17 +174,26 @@ def test_abstract_class
def test_inheritance_base_class
assert_equal Post, Post.base_class
assert_predicate Post, :base_class?
assert_equal Post, SpecialPost.base_class
assert_not_predicate SpecialPost, :base_class?
assert_equal Post, StiPost.base_class
assert_not_predicate StiPost, :base_class?
assert_equal Post, SubStiPost.base_class
assert_not_predicate SubStiPost, :base_class?
assert_equal SubAbstractStiPost, SubAbstractStiPost.base_class
assert_predicate SubAbstractStiPost, :base_class?
end
def test_abstract_inheritance_base_class
assert_equal LoosePerson, LoosePerson.base_class
assert_predicate LoosePerson, :base_class?
assert_equal LooseDescendant, LooseDescendant.base_class
assert_predicate LooseDescendant, :base_class?
assert_equal TightPerson, TightPerson.base_class
assert_predicate TightPerson, :base_class?
assert_equal TightPerson, TightDescendant.base_class
assert_not_predicate TightDescendant, :base_class?
end
def test_base_class_activerecord_error
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册