mongoid_touch_parents_recursively 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 SunshineLibrary
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,31 @@
1
+ mongoid_touch_parents_recursively
2
+ =================================
3
+
4
+ touch parents recursively in Mongoid
5
+
6
+ Install
7
+ --------------------------------
8
+ gem 'mongoid_touch_parents_recursively'
9
+
10
+ Usage
11
+ --------------------------------
12
+
13
+ ```ruby
14
+ # 配置最公用的Mongoid::Sunshine
15
+ module Mongoid
16
+ module Sunshine
17
+ extend ActiveSupport::Concern
18
+ included do
19
+ include Mongoid::Document
20
+ include Mongoid::Timestamps
21
+ include Mongoid::TouchParentsRecursively
22
+ end
23
+ end
24
+ end
25
+
26
+ # 配置需要touch的父级
27
+ ::Mongoid::TouchParentsRecursively.allowed_models_proc = lambda do |model_name|
28
+ [Subject, Folder, FolderClassroom, FolderPiece, Piece].map(&:to_s).include? model_name
29
+ end
30
+
31
+ ```
@@ -0,0 +1,59 @@
1
+ # encoding: UTF-8
2
+ # TODO 需要修改relations等,才能改为ActiveModel公用
3
+
4
+ require 'mongoid'
5
+
6
+ module ::Mongoid
7
+ module TouchParentsRecursively
8
+ extend ActiveSupport::Concern
9
+
10
+ # 设置是否忽略某些model
11
+ mattr_accessor :allowed_models_proc
12
+ self.allowed_models_proc = proc {|model| true }
13
+
14
+ included do
15
+
16
+ after_save :touch_parents_recursively
17
+ def touch_parents_recursively
18
+ # cache @__parents
19
+ @__parents ||= begin
20
+ __parents = Set.new
21
+
22
+ # 按 @diyumoshushi 建议,CRUD需要通知到所有关联的父级对象,包括多对多,这样可以兼容被删除的情况。
23
+ # @mvj3 但是只在第一级就可兼容多对多情况下被删除的情况。因为关联的第二级以上就没有被删除了。
24
+ # 根本解决的是 **引用的问题**,去通知位于顶级的subject去更新。
25
+ Utils.fetch_and_store_parent __parents, self, true
26
+ end
27
+
28
+ @__parents.each(&:touch)
29
+ end
30
+ end
31
+
32
+
33
+ # put encapsulation method here
34
+ module Utils
35
+ def self.fetch_and_store_parent __parents, __parent, is_first_level
36
+ # parents 可能的是 has_and_belongs_to_many or belongs_to
37
+ Array(__parent).each do |__parent1| # compact with Mongoid::Relations::Targets::Enumerable as Enumerable
38
+ __parent1.class.relations.select do |k, v|
39
+ __result = false
40
+ __result ||= (v.macro == :belongs_to)
41
+ __result ||= (k.match(__parent1.class.name.singularize.downcase) && (v.macro != :embeds_many)) if is_first_level
42
+ __result = false if not ::Mongoid::TouchParentsRecursively.allowed_models_proc.call(v.class_name)
43
+ __result
44
+ end.map do |k, v|
45
+ Array(__parent1.send(k))
46
+ end.flatten.each do |__parent2|
47
+ if not __parents.include? __parent2
48
+ __parents.add __parent2
49
+ Utils.fetch_and_store_parent __parents, __parent2, false
50
+ end
51
+ end
52
+ end
53
+
54
+ return __parents
55
+ end
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,16 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'mongoid_touch_parents_recursively'
3
+ s.version = '0.0.1'
4
+ s.date = '2013-12-04'
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 = 'mvjome@gmail.com'
9
+ s.homepage = 'https://github.com/SunshineLibrary/mongoid_touch_parents_recursively/'
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
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mongoid_touch_parents_recursively
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - David Chen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-12-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: mongoid
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: activesupport
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>'
36
+ - !ruby/object:Gem::Version
37
+ version: '3.2'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>'
44
+ - !ruby/object:Gem::Version
45
+ version: '3.2'
46
+ description: touch parents recursively in Mongoid
47
+ email: mvjome@gmail.com
48
+ executables: []
49
+ extensions: []
50
+ extra_rdoc_files: []
51
+ files:
52
+ - .gitignore
53
+ - LICENSE
54
+ - README.markdown
55
+ - lib/mongoid_touch_parents_recursively.rb
56
+ - mongoid_touch_parents_recursively.gemspec
57
+ homepage: https://github.com/SunshineLibrary/mongoid_touch_parents_recursively/
58
+ licenses:
59
+ - MIT
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubyforge_project:
78
+ rubygems_version: 1.8.23
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: touch parents recursively in Mongoid
82
+ test_files: []