Skip to content

Commit adc1693

Browse files
committed
Add source code
1 parent 42d217d commit adc1693

4 files changed

+81
-4
lines changed

README.markdown

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
mongoid_sync_with_deserialization
2+
=================================
3+
解决JSON同步数据时,不支持Time等类型序列化的问题。
4+
5+
6+
TODO
7+
---------------------------------
8+
需要修改fields,才能ActiveModel公用
9+
10+
参考
11+
---------------------------------
12+
Store Data type in JSON, MongoDB has a solution. http://markembling.info/2011/07/json-date-time
13+
14+
```text
15+
MongoDB shell version: 1.8.2
16+
connecting to: test
17+
> db.tests.insert({'ts':new Date()})
18+
> db.tests.find()
19+
{ "_id" : ObjectId("4e1f671d671bd7812369551e"), "ts" : ISODate("2011-07-14T22:01:01.947Z") }
20+
```

README.md

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# encoding: UTF-8
2+
3+
require 'rails'
4+
require 'mongoid'
5+
6+
module ::Mongoid
7+
module SyncWithDeserialization
8+
extend ActiveSupport::Concern
9+
10+
included do
11+
cattr_accessor :deserialization_parsers
12+
before_save :deserialization_before_sync
13+
14+
def deserialization_before_sync
15+
Utils.load_parsers self.class
16+
17+
self.class.deserialization_parsers.each do |_field, _field_parser|
18+
_v = self.read_attribute(_field)
19+
if _v.is_a?(String)
20+
_v = _field_parser.call(_v) rescue _v
21+
self.write_attribute(_field, _v)
22+
end
23+
Rails.logger.info "#{_field} : #{_field_parser} : #{_v}" if $IS_DEBUG_SyncWithDeserialization
24+
end
25+
end
26+
end
27+
28+
29+
module Utils
30+
def self.load_parsers klass
31+
return false if not klass.deserialization_parsers.blank?
32+
klass.deserialization_parsers ||= {}
33+
34+
klass.fields.each do |_field_k, _field_v|
35+
# Add more data parsers
36+
if [Time, DateTime].include? _field_v.type
37+
klass.deserialization_parsers[_field_k] = proc {|v| Time.zone.parse(v) }
38+
end
39+
end
40+
41+
end
42+
end
43+
44+
end
45+
end
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
Gem::Specification.new do |s|
2+
s.name = 'mongoid_sync_with_deserialization'
3+
s.version = '0.0.1'
4+
s.date = '2013-12-05'
5+
s.summary = File.read("README.markdown").split(/===+/)[1].strip.split("\n")[0]
6+
s.description = s.summary
7+
s.authors = ["David Chen"]
8+
s.email = '[email protected]'
9+
s.homepage = 'https://github.com/SunshineLibrary/mongoid_sync_with_deserialization/'
10+
s.license = 'MIT'
11+
12+
s.add_dependency "mongoid"
13+
s.add_dependency "activesupport", "> 3.2"
14+
15+
s.files = `git ls-files`.split("\n")
16+
end

0 commit comments

Comments
 (0)