diff --git a/lib/couchrest/core/model.rb b/lib/couchrest/core/model.rb index 66161a2..7752cf7 100644 --- a/lib/couchrest/core/model.rb +++ b/lib/couchrest/core/model.rb @@ -519,17 +519,14 @@ module CouchRest self.class.casts.each do |k,v| next unless self[k] target = v[:as] + v[:send] ||= 'new' if target.is_a?(Array) klass = ::Extlib::Inflection.constantize(target[0]) self[k] = self[k].collect do |value| - klass == Time ? Time.parse(value) : klass.new(value) + klass.send(v[:send], value) end else - self[k] = if target == 'Time' - Time.parse(self[k]) - else - ::Extlib::Inflection.constantize(target).new(self[k]) - end + self[k] = ::Extlib::Inflection.constantize(target).send(v[:send], self[k]) end end end diff --git a/spec/couchrest/core/model_spec.rb b/spec/couchrest/core/model_spec.rb index ff12544..58a57bc 100644 --- a/spec/couchrest/core/model_spec.rb +++ b/spec/couchrest/core/model_spec.rb @@ -89,6 +89,12 @@ class Player < CouchRest::Model timestamps! end +class Event < CouchRest::Model + key_accessor :subject, :occurs_at + + cast :occurs_at, :as => 'Time', :send => 'parse' +end + describe "save bug" do before(:each) do CouchRest::Model.default_database = reset_test_db! @@ -322,6 +328,18 @@ describe CouchRest::Model do end end + describe "cast keys to any type" do + before(:all) do + event_doc = { :subject => "Some event", :occurs_at => Time.now } + e = Event.database.save event_doc + + @event = Event.get e['id'] + end + it "should cast created_at to Time" do + @event['occurs_at'].should be_an_instance_of(Time) + end + end + describe "saving a model" do before(:all) do @obj = Basic.new