提交 307a519d 编写于 作者: M Matthew Draper

Merge pull request #14833 from jyao6/attribute_inheritance

Fixed Attribute Inheritance Issue
* Fix `stored_attributes` to correctly merge the details of stored
attributes defined in parent classes.
Fixes #14672.
*Brad Bennett*, *Jessica Yao*, *Lakshmi Parthasarathy*
* `change_column_default` allows `[]` as argument to `change_column_default`.
Fixes #11586.
......
......@@ -66,8 +66,9 @@ module Store
extend ActiveSupport::Concern
included do
class_attribute :stored_attributes, instance_accessor: false
self.stored_attributes = {}
class << self
attr_accessor :local_stored_attributes
end
end
module ClassMethods
......@@ -93,9 +94,9 @@ def store_accessor(store_attribute, *keys)
# assign new store attribute and create new hash to ensure that each class in the hierarchy
# has its own hash of stored attributes.
self.stored_attributes = {} if self.stored_attributes.blank?
self.stored_attributes[store_attribute] ||= []
self.stored_attributes[store_attribute] |= keys
self.local_stored_attributes ||= {}
self.local_stored_attributes[store_attribute] ||= []
self.local_stored_attributes[store_attribute] |= keys
end
def _store_accessors_module
......@@ -105,6 +106,14 @@ def _store_accessors_module
mod
end
end
def stored_attributes
parent = superclass.respond_to?(:stored_attributes) ? superclass.stored_attributes : {}
if self.local_stored_attributes
parent.merge!(self.local_stored_attributes) { |k, a, b| a | b }
end
parent
end
end
protected
......
......@@ -163,6 +163,22 @@ class StoreTest < ActiveRecord::TestCase
assert_equal [:width, :height], second_model.stored_attributes[:data]
end
test "stored_attributes are tracked per subclass" do
first_model = Class.new(ActiveRecord::Base) do
store_accessor :data, :color
end
second_model = Class.new(first_model) do
store_accessor :data, :width, :height
end
third_model = Class.new(first_model) do
store_accessor :data, :area, :volume
end
assert_equal [:color], first_model.stored_attributes[:data]
assert_equal [:color, :width, :height], second_model.stored_attributes[:data]
assert_equal [:color, :area, :volume], third_model.stored_attributes[:data]
end
test "YAML coder initializes the store when a Nil value is given" do
assert_equal({}, @john.params)
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册