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

stop redifining methods on every call to set_primary_key

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