aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb
diff options
context:
space:
mode:
authorSean Griffin <sean@thoughtbot.com>2014-05-21 07:44:42 -0700
committerSean Griffin <sean@thoughtbot.com>2014-05-21 07:44:42 -0700
commit30bf07d172f2764b27e887ff3a122ce3c08ff5fe (patch)
treea837466fc44970347c48445db8a2926a7cc8d189 /activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb
parentb452e4a39b8a4a8880825cc1868df656ede7d609 (diff)
downloadrails-30bf07d172f2764b27e887ff3a122ce3c08ff5fe.tar.gz
rails-30bf07d172f2764b27e887ff3a122ce3c08ff5fe.tar.bz2
rails-30bf07d172f2764b27e887ff3a122ce3c08ff5fe.zip
Move PG OID types to their own files
As we promote these classes to first class concepts, these classes are starting to gain enough behavior to warrant being moved into their own files. Many of them will become quite large as we move additional behavior to the type objects.
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb')
-rw-r--r--activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb37
1 files changed, 37 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb b/activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb
new file mode 100644
index 0000000000..1e34c09c88
--- /dev/null
+++ b/activerecord/lib/active_record/connection_adapters/postgresql/oid/money.rb
@@ -0,0 +1,37 @@
+module ActiveRecord
+ module ConnectionAdapters
+ module PostgreSQL
+ module OID # :nodoc:
+ class Money < Type::Decimal
+ include Infinity
+
+ def extract_scale(sql_type)
+ 2
+ end
+
+ def cast_value(value)
+ return value unless ::String === value
+
+ # Because money output is formatted according to the locale, there are two
+ # cases to consider (note the decimal separators):
+ # (1) $12,345,678.12
+ # (2) $12.345.678,12
+ # Negative values are represented as follows:
+ # (3) -$2.55
+ # (4) ($2.55)
+
+ value.sub!(/^\((.+)\)$/, '-\1') # (4)
+ case value
+ when /^-?\D+[\d,]+\.\d{2}$/ # (1)
+ value.gsub!(/[^-\d.]/, '')
+ when /^-?\D+[\d.]+,\d{2}$/ # (2)
+ value.gsub!(/[^-\d,]/, '').sub!(/,/, '.')
+ end
+
+ super(value)
+ end
+ end
+ end
+ end
+ end
+end