From 96838b5192e46caecc73cf45968fd27b78a41404 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Tue, 20 Dec 2011 11:18:36 -0800 Subject: can create hstore records via AR API --- activerecord/CHANGELOG.md | 2 ++ .../connection_adapters/postgresql_adapter.rb | 14 +++++++++----- activerecord/test/cases/adapters/postgresql/hstore_test.rb | 7 +++++++ 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 -- cgit v1.2.3