aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/attribute_set/builder.rb
diff options
context:
space:
mode:
authorSean Griffin <sean@thoughtbot.com>2014-06-22 15:38:55 -0600
committerSean Griffin <sean@thoughtbot.com>2014-06-25 08:51:15 -0600
commita89f8a922d8f37245f3ca60748adc5f4c8ee88d2 (patch)
treec04fda9454dd7bcc873ea6f38da878447805f385 /activerecord/lib/active_record/attribute_set/builder.rb
parent9ac1ce11ad9ec22157d2e542437c5c5cccaf58fe (diff)
downloadrails-a89f8a922d8f37245f3ca60748adc5f4c8ee88d2.tar.gz
rails-a89f8a922d8f37245f3ca60748adc5f4c8ee88d2.tar.bz2
rails-a89f8a922d8f37245f3ca60748adc5f4c8ee88d2.zip
Move behavior of `read_attribute` to `AttributeSet`
Moved `Builder` to its own file, as it started looking very weird once I added private methods to the `AttributeSet` class and the `Builder` class started to grow. Would like to refactor `fetch_value` to change to ```ruby self[name].value(&block) ``` But that requires the attributes to know about their name, which they currently do not.
Diffstat (limited to 'activerecord/lib/active_record/attribute_set/builder.rb')
-rw-r--r--activerecord/lib/active_record/attribute_set/builder.rb33
1 files changed, 33 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/attribute_set/builder.rb b/activerecord/lib/active_record/attribute_set/builder.rb
new file mode 100644
index 0000000000..d91720d5e1
--- /dev/null
+++ b/activerecord/lib/active_record/attribute_set/builder.rb
@@ -0,0 +1,33 @@
+module ActiveRecord
+ class AttributeSet # :nodoc:
+ class Builder # :nodoc:
+ attr_reader :types
+
+ def initialize(types)
+ @types = types
+ end
+
+ def build_from_database(values, additional_types = {})
+ attributes = build_attributes_from_values(values, additional_types)
+ add_uninitialized_attributes(attributes)
+ AttributeSet.new(attributes)
+ end
+
+ private
+
+ def build_attributes_from_values(values, additional_types)
+ attributes = Hash.new(Attribute::Null)
+ values.each_with_object(attributes) do |(name, value), hash|
+ type = additional_types.fetch(name, types[name])
+ hash[name] = Attribute.from_database(value, type)
+ end
+ end
+
+ def add_uninitialized_attributes(attributes)
+ types.except(*attributes.keys).each do |name, type|
+ attributes[name] = Attribute.uninitialized(type)
+ end
+ end
+ end
+ end
+end