提交 ec13305b 编写于 作者: A Aaron Patterson

stop redifining methods on every call to set_primary_key

上级 23b03bab
......@@ -14,11 +14,13 @@ module ClassMethods
# Defines the primary key field -- can be overridden in subclasses. Overwriting will negate any effect of the
# primary_key_prefix_type setting, though.
def primary_key
reset_primary_key
@primary_key ||= reset_primary_key
end
def reset_primary_key #:nodoc:
key = get_primary_key(base_class.name)
key = self == base_class ? get_primary_key(base_class.name) :
base_class.primary_key
set_primary_key(key)
key
end
......@@ -40,6 +42,9 @@ def get_primary_key(base_name) #:nodoc:
end
end
attr_accessor :original_primary_key
attr_writer :primary_key
# Sets the name of the primary key column to use to the given value,
# or (if the value is nil or false) to the value returned by the given
# block.
......@@ -48,9 +53,11 @@ def get_primary_key(base_name) #:nodoc:
# set_primary_key "sysid"
# end
def set_primary_key(value = nil, &block)
define_attr_method :primary_key, value, &block
@primary_key ||= ''
self.original_primary_key = @primary_key
value &&= value.to_s
self.primary_key = block_given? ? instance_eval(&block) : value
end
alias :primary_key= :set_primary_key
end
end
end
......
......@@ -1073,10 +1073,14 @@ def test_define_attr_method_with_value
end
def test_define_attr_method_with_block
k = Class.new( ActiveRecord::Base )
k.primary_key = "id"
k.send(:define_attr_method, :primary_key) { "sys_" + original_primary_key }
assert_equal "sys_id", k.primary_key
k = Class.new( ActiveRecord::Base ) do
class << self
attr_accessor :foo_key
end
end
k.foo_key = "id"
k.send(:define_attr_method, :foo_key) { "sys_" + original_foo_key }
assert_equal "sys_id", k.foo_key
end
def test_set_table_name_with_value
......
......@@ -219,6 +219,10 @@ def test_alt_eager_loading
switch_to_default_inheritance_column
end
def test_inherits_custom_primary_key
assert_equal Subscriber.primary_key, SpecialSubscriber.primary_key
end
def test_inheritance_without_mapping
assert_kind_of SpecialSubscriber, SpecialSubscriber.find("webster132")
assert_nothing_raised { s = SpecialSubscriber.new("name" => "And breaaaaathe!"); s.id = 'roger'; s.save }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册