aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activerecord/CHANGELOG.md2
-rw-r--r--activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb14
-rw-r--r--activerecord/test/cases/adapters/postgresql/hstore_test.rb7
3 files changed, 18 insertions, 5 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md
index 6ea8ce129a..ee2811c2be 100644
--- a/activerecord/CHANGELOG.md
+++ b/activerecord/CHANGELOG.md
@@ -1,5 +1,7 @@
## Rails 4.0.0 (unreleased) ##
+* PostgreSQL hstore records can be created.
+
* PostgreSQL hstore types are automatically deserialized from the database.
## Rails 3.2.0 (unreleased) ##
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
index c26b61443b..6e169ae5c5 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
@@ -50,11 +50,15 @@ module ActiveRecord
end
end
- def cast_hstore(string)
- kvs = string.split(', ').map { |kv|
- kv.split('=>').map { |k| k[1...-1] }
- }
- Hash[kvs]
+ def cast_hstore(object)
+ if Hash === object
+ object.map { |k,v| "#{k}=>#{v}" }.join ', '
+ else
+ kvs = object.split(', ').map { |kv|
+ kv.split('=>').map { |k| k[1...-1] }
+ }
+ Hash[kvs]
+ end
end
end
# :startdoc:
diff --git a/activerecord/test/cases/adapters/postgresql/hstore_test.rb b/activerecord/test/cases/adapters/postgresql/hstore_test.rb
index 5031486f29..7267536142 100644
--- a/activerecord/test/cases/adapters/postgresql/hstore_test.rb
+++ b/activerecord/test/cases/adapters/postgresql/hstore_test.rb
@@ -43,4 +43,11 @@ class PostgresqlHstoreTest < ActiveRecord::TestCase
x = Hstore.find :first
assert_equal({'1' => '2', '2' => '3'}, x.tags)
end
+
+ def test_create
+ hash = { 'a' => 'b', '1' => '2' }
+ x = Hstore.create!(:tags => hash)
+ x.reload
+ assert_equal hash, x.tags
+ end
end