mongoid_followable 0.1.0 → 0.1.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/.idea/misc.xml +1 -1
- data/.idea/workspace.xml +48 -56
- data/README.rdoc +35 -12
- data/lib/mongoid_followable/followable.rb +3 -87
- data/lib/mongoid_followable/follower.rb +113 -0
- data/lib/mongoid_followable/version.rb +1 -1
- data/lib/mongoid_followable.rb +1 -0
- data/spec/models/user.rb +1 -0
- metadata +32 -2
data/.idea/misc.xml
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
<component name="DependencyValidationManager">
|
|
4
4
|
<option name="SKIP_IMPORT_STATEMENTS" value="false" />
|
|
5
5
|
</component>
|
|
6
|
-
<component name="ProjectRootManager" version="2" project-jdk-name="ruby-1.9.2-
|
|
6
|
+
<component name="ProjectRootManager" version="2" project-jdk-name="RVM: ruby-1.9.2-p136" project-jdk-type="RUBY_SDK" />
|
|
7
7
|
</project>
|
|
8
8
|
|
data/.idea/workspace.xml
CHANGED
|
@@ -2,17 +2,13 @@
|
|
|
2
2
|
<project version="4">
|
|
3
3
|
<component name="ChangeListManager">
|
|
4
4
|
<list default="true" id="90bdec60-890b-4083-b05d-2f665a1f4d70" name="Default" comment="">
|
|
5
|
-
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/
|
|
6
|
-
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/mongoid_followable/followable.rb" />
|
|
7
|
-
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/spec/models/group.rb" />
|
|
8
|
-
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/mongoid_followable.iml" afterPath="$PROJECT_DIR$/.idea/mongoid_followable.iml" />
|
|
5
|
+
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/mongoid_followable/follower.rb" />
|
|
9
6
|
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/misc.xml" afterPath="$PROJECT_DIR$/.idea/misc.xml" />
|
|
10
7
|
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
|
|
11
8
|
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/mongoid_followable.rb" afterPath="$PROJECT_DIR$/lib/mongoid_followable.rb" />
|
|
9
|
+
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/mongoid_followable/followable.rb" afterPath="$PROJECT_DIR$/lib/mongoid_followable/followable.rb" />
|
|
12
10
|
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/mongoid_followable/version.rb" afterPath="$PROJECT_DIR$/lib/mongoid_followable/version.rb" />
|
|
13
|
-
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/
|
|
14
|
-
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/spec/mongoid/followable_spec.rb" afterPath="$PROJECT_DIR$/spec/mongoid/followable_spec.rb" />
|
|
15
|
-
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/spec/spec_helper.rb" afterPath="$PROJECT_DIR$/spec/spec_helper.rb" />
|
|
11
|
+
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/spec/models/user.rb" afterPath="$PROJECT_DIR$/spec/models/user.rb" />
|
|
16
12
|
</list>
|
|
17
13
|
<ignored path="mongoid_followable.iws" />
|
|
18
14
|
<ignored path=".idea/workspace.xml" />
|
|
@@ -35,7 +31,17 @@
|
|
|
35
31
|
<favorites_list name="mongoid_followable" />
|
|
36
32
|
</component>
|
|
37
33
|
<component name="FileEditorManager">
|
|
38
|
-
<leaf
|
|
34
|
+
<leaf>
|
|
35
|
+
<file leaf-file-name="mongoid_followable.rb" pinned="false" current="true" current-in-tab="true">
|
|
36
|
+
<entry file="file://$PROJECT_DIR$/lib/mongoid_followable.rb">
|
|
37
|
+
<provider selected="true" editor-type-id="text-editor">
|
|
38
|
+
<state line="1" column="70" selection-start="145" selection-end="145" vertical-scroll-proportion="0.02173913">
|
|
39
|
+
<folding />
|
|
40
|
+
</state>
|
|
41
|
+
</provider>
|
|
42
|
+
</entry>
|
|
43
|
+
</file>
|
|
44
|
+
</leaf>
|
|
39
45
|
</component>
|
|
40
46
|
<component name="FindManager">
|
|
41
47
|
<FindUsagesManager>
|
|
@@ -49,19 +55,20 @@
|
|
|
49
55
|
<component name="IdeDocumentHistory">
|
|
50
56
|
<option name="changedFiles">
|
|
51
57
|
<list>
|
|
52
|
-
<option value="$PROJECT_DIR$/spec/models/user.rb" />
|
|
53
58
|
<option value="$PROJECT_DIR$/app/models/followee.rb" />
|
|
54
59
|
<option value="$PROJECT_DIR$/app/models/follower.rb" />
|
|
55
60
|
<option value="$PROJECT_DIR$/spec/models/group.rb" />
|
|
56
|
-
<option value="$PROJECT_DIR$/lib/mongoid_followable/version.rb" />
|
|
57
61
|
<option value="$PROJECT_DIR$/lib/mongoid_followable/follow.rb" />
|
|
58
62
|
<option value="$PROJECT_DIR$/lib/generators/mongoid_followable/install_generator.rb" />
|
|
59
63
|
<option value="$PROJECT_DIR$/spec/spec_helper.rb" />
|
|
60
|
-
<option value="$PROJECT_DIR$/lib/mongoid_followable.rb" />
|
|
61
64
|
<option value="$PROJECT_DIR$/app/models/follow.rb" />
|
|
62
65
|
<option value="$PROJECT_DIR$/spec/mongoid/followable_spec.rb" />
|
|
63
|
-
<option value="$PROJECT_DIR$/lib/mongoid_followable/followable.rb" />
|
|
64
66
|
<option value="$PROJECT_DIR$/mongoid_followable.gemspec" />
|
|
67
|
+
<option value="$PROJECT_DIR$/lib/mongoid_followable/follower.rb" />
|
|
68
|
+
<option value="$PROJECT_DIR$/lib/mongoid_followable/followable.rb" />
|
|
69
|
+
<option value="$PROJECT_DIR$/lib/mongoid_followable.rb" />
|
|
70
|
+
<option value="$PROJECT_DIR$/spec/models/user.rb" />
|
|
71
|
+
<option value="$PROJECT_DIR$/lib/mongoid_followable/version.rb" />
|
|
65
72
|
</list>
|
|
66
73
|
</option>
|
|
67
74
|
</component>
|
|
@@ -91,7 +98,6 @@
|
|
|
91
98
|
<sortByType />
|
|
92
99
|
</navigator>
|
|
93
100
|
<panes>
|
|
94
|
-
<pane id="Favorites" />
|
|
95
101
|
<pane id="ProjectPane">
|
|
96
102
|
<subPane>
|
|
97
103
|
<PATH>
|
|
@@ -124,24 +130,6 @@
|
|
|
124
130
|
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
|
125
131
|
</PATH_ELEMENT>
|
|
126
132
|
</PATH>
|
|
127
|
-
<PATH>
|
|
128
|
-
<PATH_ELEMENT>
|
|
129
|
-
<option name="myItemId" value="mongoid_followable" />
|
|
130
|
-
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
|
|
131
|
-
</PATH_ELEMENT>
|
|
132
|
-
<PATH_ELEMENT>
|
|
133
|
-
<option name="myItemId" value="mongoid_followable" />
|
|
134
|
-
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
|
135
|
-
</PATH_ELEMENT>
|
|
136
|
-
<PATH_ELEMENT>
|
|
137
|
-
<option name="myItemId" value="spec" />
|
|
138
|
-
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
|
139
|
-
</PATH_ELEMENT>
|
|
140
|
-
<PATH_ELEMENT>
|
|
141
|
-
<option name="myItemId" value="mongoid" />
|
|
142
|
-
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
|
143
|
-
</PATH_ELEMENT>
|
|
144
|
-
</PATH>
|
|
145
133
|
<PATH>
|
|
146
134
|
<PATH_ELEMENT>
|
|
147
135
|
<option name="myItemId" value="mongoid_followable" />
|
|
@@ -212,6 +200,7 @@
|
|
|
212
200
|
</PATH>
|
|
213
201
|
</subPane>
|
|
214
202
|
</pane>
|
|
203
|
+
<pane id="Favorites" />
|
|
215
204
|
<pane id="Scope" />
|
|
216
205
|
</panes>
|
|
217
206
|
</component>
|
|
@@ -267,14 +256,14 @@
|
|
|
267
256
|
<servers />
|
|
268
257
|
</component>
|
|
269
258
|
<component name="ToolWindowManager">
|
|
270
|
-
<frame x="
|
|
271
|
-
<editor active="
|
|
259
|
+
<frame x="1" y="24" width="1598" height="851" extended-state="1" />
|
|
260
|
+
<editor active="true" />
|
|
272
261
|
<layout>
|
|
273
262
|
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
|
274
263
|
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
|
|
275
264
|
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="true" content_ui="tabs" />
|
|
276
265
|
<window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
|
277
|
-
<window_info id="Project" active="
|
|
266
|
+
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.17643312" sideWeight="0.67128986" order="0" side_tool="false" content_ui="tabs" />
|
|
278
267
|
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
|
|
279
268
|
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
|
|
280
269
|
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
|
@@ -335,63 +324,66 @@
|
|
|
335
324
|
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" />
|
|
336
325
|
</provider>
|
|
337
326
|
</entry>
|
|
338
|
-
<entry file="file://$PROJECT_DIR$/spec/
|
|
327
|
+
<entry file="file://$PROJECT_DIR$/spec/spec_helper.rb">
|
|
339
328
|
<provider selected="true" editor-type-id="text-editor">
|
|
340
|
-
<state line="
|
|
341
|
-
<folding />
|
|
342
|
-
</state>
|
|
329
|
+
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" />
|
|
343
330
|
</provider>
|
|
344
331
|
</entry>
|
|
345
|
-
<entry file="file://$PROJECT_DIR$/spec/
|
|
332
|
+
<entry file="file://$PROJECT_DIR$/spec/mongoid/followable_spec.rb">
|
|
346
333
|
<provider selected="true" editor-type-id="text-editor">
|
|
347
|
-
<state line="
|
|
348
|
-
<folding />
|
|
349
|
-
</state>
|
|
334
|
+
<state line="71" column="31" selection-start="1675" selection-end="1675" vertical-scroll-proportion="1.7959528" />
|
|
350
335
|
</provider>
|
|
351
336
|
</entry>
|
|
352
|
-
<entry file="file://$PROJECT_DIR$/
|
|
337
|
+
<entry file="file://$PROJECT_DIR$/mongoid_followable.gemspec">
|
|
338
|
+
<provider selected="true" editor-type-id="text-editor">
|
|
339
|
+
<state line="11" column="66" selection-start="437" selection-end="437" vertical-scroll-proportion="0.2782462" />
|
|
340
|
+
</provider>
|
|
341
|
+
</entry>
|
|
342
|
+
<entry file="file://$PROJECT_DIR$/app/models/follow.rb">
|
|
353
343
|
<provider selected="true" editor-type-id="text-editor">
|
|
354
|
-
<state line="
|
|
344
|
+
<state line="10" column="44" selection-start="315" selection-end="315" vertical-scroll-proportion="0.2173913">
|
|
355
345
|
<folding />
|
|
356
346
|
</state>
|
|
357
347
|
</provider>
|
|
358
348
|
</entry>
|
|
359
|
-
<entry file="file://$PROJECT_DIR$/
|
|
349
|
+
<entry file="file://$PROJECT_DIR$/lib/mongoid_followable/followable.rb">
|
|
360
350
|
<provider selected="true" editor-type-id="text-editor">
|
|
361
|
-
<state line="
|
|
351
|
+
<state line="15" column="27" selection-start="385" selection-end="385" vertical-scroll-proportion="0.0">
|
|
362
352
|
<folding />
|
|
363
353
|
</state>
|
|
364
354
|
</provider>
|
|
365
355
|
</entry>
|
|
366
|
-
<entry file="file://$PROJECT_DIR$/
|
|
356
|
+
<entry file="file://$PROJECT_DIR$/lib/mongoid_followable/follower.rb">
|
|
367
357
|
<provider selected="true" editor-type-id="text-editor">
|
|
368
|
-
<state line="
|
|
358
|
+
<state line="12" column="44" selection-start="299" selection-end="299" vertical-scroll-proportion="0.26086956">
|
|
369
359
|
<folding />
|
|
370
360
|
</state>
|
|
371
361
|
</provider>
|
|
372
362
|
</entry>
|
|
373
|
-
<entry file="file://$PROJECT_DIR$/
|
|
363
|
+
<entry file="file://$PROJECT_DIR$/lib/mongoid_followable/version.rb">
|
|
374
364
|
<provider selected="true" editor-type-id="text-editor">
|
|
375
|
-
<state line="
|
|
365
|
+
<state line="2" column="20" selection-start="55" selection-end="55" vertical-scroll-proportion="0.04347826">
|
|
376
366
|
<folding />
|
|
377
367
|
</state>
|
|
378
368
|
</provider>
|
|
379
369
|
</entry>
|
|
380
|
-
<entry file="file://$PROJECT_DIR$/
|
|
370
|
+
<entry file="file://$PROJECT_DIR$/spec/models/user.rb">
|
|
381
371
|
<provider selected="true" editor-type-id="text-editor">
|
|
382
|
-
<state line="
|
|
372
|
+
<state line="3" column="27" selection-start="96" selection-end="96" vertical-scroll-proportion="0.06521739">
|
|
373
|
+
<folding />
|
|
374
|
+
</state>
|
|
383
375
|
</provider>
|
|
384
376
|
</entry>
|
|
385
|
-
<entry file="file://$PROJECT_DIR$/
|
|
377
|
+
<entry file="file://$PROJECT_DIR$/spec/models/group.rb">
|
|
386
378
|
<provider selected="true" editor-type-id="text-editor">
|
|
387
|
-
<state line="
|
|
379
|
+
<state line="2" column="29" selection-start="69" selection-end="69" vertical-scroll-proportion="0.04347826">
|
|
388
380
|
<folding />
|
|
389
381
|
</state>
|
|
390
382
|
</provider>
|
|
391
383
|
</entry>
|
|
392
|
-
<entry file="file://$PROJECT_DIR$/lib/mongoid_followable
|
|
384
|
+
<entry file="file://$PROJECT_DIR$/lib/mongoid_followable.rb">
|
|
393
385
|
<provider selected="true" editor-type-id="text-editor">
|
|
394
|
-
<state line="
|
|
386
|
+
<state line="1" column="70" selection-start="145" selection-end="145" vertical-scroll-proportion="0.02173913">
|
|
395
387
|
<folding />
|
|
396
388
|
</state>
|
|
397
389
|
</provider>
|
data/README.rdoc
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
In console:
|
|
6
6
|
gem install mongoid_followable
|
|
7
7
|
or in Gemfile:
|
|
8
|
-
gem 'mongoid_followable'
|
|
8
|
+
gem 'mongoid_followable', ">= 0.1.0"
|
|
9
9
|
|
|
10
10
|
== Usage
|
|
11
11
|
|
|
@@ -14,33 +14,56 @@ To make model followable you need to include Mongoid::Followable into your docum
|
|
|
14
14
|
include Mongoid::Document
|
|
15
15
|
include Mongoid::Followable
|
|
16
16
|
end
|
|
17
|
+
|
|
18
|
+
class Group
|
|
19
|
+
include Mongoid::Document
|
|
20
|
+
include Mongoid::Followable
|
|
21
|
+
end
|
|
22
|
+
|
|
17
23
|
Now you can follow others in your controller:
|
|
18
24
|
...
|
|
19
|
-
@
|
|
20
|
-
|
|
25
|
+
@group = Group.new
|
|
26
|
+
@group.save
|
|
27
|
+
|
|
28
|
+
current_user.follow(@group)
|
|
21
29
|
|
|
22
|
-
current_user.unfollow(@
|
|
30
|
+
current_user.unfollow(@group)
|
|
23
31
|
|
|
24
|
-
current_user.follower_of?(@
|
|
25
|
-
current_user.followee_of?(@
|
|
32
|
+
current_user.follower_of?(@group)
|
|
33
|
+
current_user.followee_of?(@group)
|
|
26
34
|
|
|
27
|
-
current_user.
|
|
28
|
-
current_user.
|
|
35
|
+
current_user.followers_count
|
|
36
|
+
current_user.followees_count
|
|
29
37
|
|
|
30
|
-
User.followers_of(
|
|
31
|
-
User.followees_of(
|
|
38
|
+
User.followers_of(@group)
|
|
39
|
+
User.followees_of(@group)
|
|
40
|
+
|
|
41
|
+
@group.all_followers
|
|
42
|
+
@user.all_followees
|
|
43
|
+
|
|
44
|
+
@group.followers_by_type("user")
|
|
45
|
+
@user.followees_by_type("group")
|
|
46
|
+
|
|
47
|
+
@group.followers_by_type("user")
|
|
48
|
+
@group.followers_count_by_type("user")
|
|
49
|
+
@user.followees_by_type("group")
|
|
50
|
+
@user.followees_count_by_type("group")
|
|
32
51
|
...
|
|
33
52
|
|
|
34
|
-
*
|
|
53
|
+
* Any bug or issue, please send me an email: ustc.flyingfox@gmail.com
|
|
35
54
|
|
|
36
55
|
== TODO
|
|
37
56
|
|
|
38
|
-
* inter-models followable
|
|
57
|
+
* inter-models followable #FINISHED#
|
|
39
58
|
* divide into two parts: followable(being followed) and follower(following others)
|
|
40
59
|
* following history/followed history
|
|
41
60
|
* most/least followed/following
|
|
42
61
|
* follow part of user like only names etc(is this necessary?)
|
|
43
62
|
|
|
63
|
+
== Thanks
|
|
64
|
+
|
|
65
|
+
Thanks the author(s) of acts_as_followable, you can find this gem here[https://github.com/xpepermint/acts_as_followable]
|
|
66
|
+
|
|
44
67
|
== Copyright
|
|
45
68
|
|
|
46
69
|
Copyright (c) Jie Fan. See LICENSE.txt for further details.
|
|
@@ -4,12 +4,11 @@ module Mongoid
|
|
|
4
4
|
|
|
5
5
|
included do |base|
|
|
6
6
|
base.has_many :followers, :class_name => "Follow", :as => :followable, :dependent => :destroy
|
|
7
|
-
base.has_many :followees, :class_name => "Follow", :as => :following, :dependent => :destroy
|
|
8
7
|
end
|
|
9
8
|
|
|
10
9
|
module ClassMethods
|
|
11
10
|
|
|
12
|
-
# get certain model's
|
|
11
|
+
# get certain model's followees of this type
|
|
13
12
|
#
|
|
14
13
|
# Example:
|
|
15
14
|
# >> @jim = User.new
|
|
@@ -18,39 +17,18 @@ module Mongoid
|
|
|
18
17
|
# >> @ruby.save
|
|
19
18
|
#
|
|
20
19
|
# >> @jim.follow(@ruby)
|
|
21
|
-
# >> User.
|
|
22
|
-
# => [@
|
|
20
|
+
# >> User.followees_of(@jim)
|
|
21
|
+
# => [@ruby]
|
|
23
22
|
#
|
|
24
23
|
# Arguments:
|
|
25
24
|
# model: instance of some followable model
|
|
26
25
|
|
|
27
|
-
def followers_of(model)
|
|
28
|
-
model.followers_by_type(self.name)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# get certain model's followees of this type
|
|
32
|
-
#
|
|
33
|
-
# Example:
|
|
34
|
-
# >> @jim.follow(@ruby)
|
|
35
|
-
# >> Group.followees_of(@jim)
|
|
36
|
-
# => [@ruby]
|
|
37
|
-
|
|
38
26
|
def followees_of(model)
|
|
39
27
|
model.followees_by_type(self.name)
|
|
40
28
|
end
|
|
41
29
|
|
|
42
30
|
end
|
|
43
31
|
|
|
44
|
-
# see if this model is follower of some model
|
|
45
|
-
#
|
|
46
|
-
# Example:
|
|
47
|
-
# >> @jim.follower_of?(@ruby)
|
|
48
|
-
# => true
|
|
49
|
-
|
|
50
|
-
def follower_of?(model)
|
|
51
|
-
0 < self.followees.by_model(model).limit(1).count * model.followers.by_model(self).limit(1).count
|
|
52
|
-
end
|
|
53
|
-
|
|
54
32
|
# see if this model is followee of some model
|
|
55
33
|
#
|
|
56
34
|
# Example:
|
|
@@ -71,16 +49,6 @@ module Mongoid
|
|
|
71
49
|
rebuild_instances(self.followers)
|
|
72
50
|
end
|
|
73
51
|
|
|
74
|
-
# get all the followees of this model, same with classmethod followees_of
|
|
75
|
-
#
|
|
76
|
-
# Example:
|
|
77
|
-
# >> @jim.all_followees
|
|
78
|
-
# => [@ruby]
|
|
79
|
-
|
|
80
|
-
def all_followees
|
|
81
|
-
rebuild_instances(self.followees)
|
|
82
|
-
end
|
|
83
|
-
|
|
84
52
|
# get all the followers of this model in certain type
|
|
85
53
|
#
|
|
86
54
|
# Example:
|
|
@@ -91,38 +59,6 @@ module Mongoid
|
|
|
91
59
|
rebuild_instances(self.followers.by_type(type))
|
|
92
60
|
end
|
|
93
61
|
|
|
94
|
-
# get all the followees of this model in certain type
|
|
95
|
-
#
|
|
96
|
-
# Example:
|
|
97
|
-
# >> @ruby.followees_by_type("group")
|
|
98
|
-
# => [@ruby]
|
|
99
|
-
|
|
100
|
-
def followees_by_type(type)
|
|
101
|
-
rebuild_instances(self.followees.by_type(type))
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
# follow some model
|
|
105
|
-
|
|
106
|
-
def follow(*models)
|
|
107
|
-
models.each do |model|
|
|
108
|
-
unless model == self or self.follower_of?(model) or model.followee_of?(self)
|
|
109
|
-
model.followers.create!(:f_type => self.class.name, :f_id => self.id.to_s)
|
|
110
|
-
self.followees.create!(:f_type => model.class.name, :f_id => model.id.to_s)
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
# unfollow some model
|
|
116
|
-
|
|
117
|
-
def unfollow(*models)
|
|
118
|
-
models.each do |model|
|
|
119
|
-
unless model == self or !self.follower_of?(model) or !model.followee_of?(self)
|
|
120
|
-
model.followers.by_model(self).first.destroy
|
|
121
|
-
self.followees.by_model(model).first.destroy
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
|
|
126
62
|
# get the number of followers
|
|
127
63
|
#
|
|
128
64
|
# Example:
|
|
@@ -133,16 +69,6 @@ module Mongoid
|
|
|
133
69
|
self.followers.count
|
|
134
70
|
end
|
|
135
71
|
|
|
136
|
-
# get the number of followees
|
|
137
|
-
#
|
|
138
|
-
# Example:
|
|
139
|
-
# >> @jim.followers_count
|
|
140
|
-
# => 1
|
|
141
|
-
|
|
142
|
-
def followees_count
|
|
143
|
-
self.followees.count
|
|
144
|
-
end
|
|
145
|
-
|
|
146
72
|
# get the number of followers in certain type
|
|
147
73
|
#
|
|
148
74
|
# Example:
|
|
@@ -153,16 +79,6 @@ module Mongoid
|
|
|
153
79
|
self.followers.by_type(type).count
|
|
154
80
|
end
|
|
155
81
|
|
|
156
|
-
# get the number of followees in certain type
|
|
157
|
-
#
|
|
158
|
-
# Example:
|
|
159
|
-
# >> @jim.followees_count_by_type("group")
|
|
160
|
-
# => 1
|
|
161
|
-
|
|
162
|
-
def followees_count_by_type(type)
|
|
163
|
-
self.followees.by_type(type).count
|
|
164
|
-
end
|
|
165
|
-
|
|
166
82
|
private
|
|
167
83
|
def rebuild_instances(follows)
|
|
168
84
|
follow_list = []
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
module Mongoid
|
|
2
|
+
module Follower
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
included do |base|
|
|
6
|
+
base.has_many :followees, :class_name => "Follow", :as => :following, :dependent => :destroy
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module ClassMethods
|
|
10
|
+
|
|
11
|
+
# get certain model's followers of this type
|
|
12
|
+
#
|
|
13
|
+
# Example:
|
|
14
|
+
# >> @jim = User.new
|
|
15
|
+
# >> @ruby = Group.new
|
|
16
|
+
# >> @jim.save
|
|
17
|
+
# >> @ruby.save
|
|
18
|
+
#
|
|
19
|
+
# >> @jim.follow(@ruby)
|
|
20
|
+
# >> User.followers_of(@ruby)
|
|
21
|
+
# => [@jim]
|
|
22
|
+
#
|
|
23
|
+
# Arguments:
|
|
24
|
+
# model: instance of some followable model
|
|
25
|
+
|
|
26
|
+
def followers_of(model)
|
|
27
|
+
model.followers_by_type(self.name)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# see if this model is follower of some model
|
|
33
|
+
#
|
|
34
|
+
# Example:
|
|
35
|
+
# >> @jim.follower_of?(@ruby)
|
|
36
|
+
# => true
|
|
37
|
+
|
|
38
|
+
def follower_of?(model)
|
|
39
|
+
0 < self.followees.by_model(model).limit(1).count * model.followers.by_model(self).limit(1).count
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# get all the followees of this model, same with classmethod followees_of
|
|
43
|
+
#
|
|
44
|
+
# Example:
|
|
45
|
+
# >> @jim.all_followees
|
|
46
|
+
# => [@ruby]
|
|
47
|
+
|
|
48
|
+
def all_followees
|
|
49
|
+
rebuild_instances(self.followees)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# get all the followees of this model in certain type
|
|
53
|
+
#
|
|
54
|
+
# Example:
|
|
55
|
+
# >> @ruby.followees_by_type("group")
|
|
56
|
+
# => [@ruby]
|
|
57
|
+
|
|
58
|
+
def followees_by_type(type)
|
|
59
|
+
rebuild_instances(self.followees.by_type(type))
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# follow some model
|
|
63
|
+
|
|
64
|
+
def follow(*models)
|
|
65
|
+
models.each do |model|
|
|
66
|
+
unless model == self or self.follower_of?(model) or model.followee_of?(self)
|
|
67
|
+
model.followers.create!(:f_type => self.class.name, :f_id => self.id.to_s)
|
|
68
|
+
self.followees.create!(:f_type => model.class.name, :f_id => model.id.to_s)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# unfollow some model
|
|
74
|
+
|
|
75
|
+
def unfollow(*models)
|
|
76
|
+
models.each do |model|
|
|
77
|
+
unless model == self or !self.follower_of?(model) or !model.followee_of?(self)
|
|
78
|
+
model.followers.by_model(self).first.destroy
|
|
79
|
+
self.followees.by_model(model).first.destroy
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# get the number of followees
|
|
85
|
+
#
|
|
86
|
+
# Example:
|
|
87
|
+
# >> @jim.followers_count
|
|
88
|
+
# => 1
|
|
89
|
+
|
|
90
|
+
def followees_count
|
|
91
|
+
self.followees.count
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# get the number of followers in certain type
|
|
95
|
+
#
|
|
96
|
+
# Example:
|
|
97
|
+
# >> @ruby.followers_count_by_type("user")
|
|
98
|
+
# => 1
|
|
99
|
+
|
|
100
|
+
def followees_count_by_type(type)
|
|
101
|
+
self.followees.by_type(type).count
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
private
|
|
105
|
+
def rebuild_instances(follows)
|
|
106
|
+
follow_list = []
|
|
107
|
+
follows.each do |follow|
|
|
108
|
+
follow_list << follow.f_type.capitalize.constantize.find(follow.f_id)
|
|
109
|
+
end
|
|
110
|
+
follow_list
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
data/lib/mongoid_followable.rb
CHANGED
data/spec/models/user.rb
CHANGED
metadata
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mongoid_followable
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
+
hash: 25
|
|
4
5
|
prerelease:
|
|
5
|
-
|
|
6
|
+
segments:
|
|
7
|
+
- 0
|
|
8
|
+
- 1
|
|
9
|
+
- 1
|
|
10
|
+
version: 0.1.1
|
|
6
11
|
platform: ruby
|
|
7
12
|
authors:
|
|
8
13
|
- Jie Fan
|
|
@@ -21,6 +26,11 @@ dependencies:
|
|
|
21
26
|
requirements:
|
|
22
27
|
- - ~>
|
|
23
28
|
- !ruby/object:Gem::Version
|
|
29
|
+
hash: 13
|
|
30
|
+
segments:
|
|
31
|
+
- 2
|
|
32
|
+
- 0
|
|
33
|
+
- 1
|
|
24
34
|
version: 2.0.1
|
|
25
35
|
type: :runtime
|
|
26
36
|
version_requirements: *id001
|
|
@@ -32,6 +42,11 @@ dependencies:
|
|
|
32
42
|
requirements:
|
|
33
43
|
- - ~>
|
|
34
44
|
- !ruby/object:Gem::Version
|
|
45
|
+
hash: 27
|
|
46
|
+
segments:
|
|
47
|
+
- 1
|
|
48
|
+
- 3
|
|
49
|
+
- 0
|
|
35
50
|
version: 1.3.0
|
|
36
51
|
type: :runtime
|
|
37
52
|
version_requirements: *id002
|
|
@@ -43,6 +58,10 @@ dependencies:
|
|
|
43
58
|
requirements:
|
|
44
59
|
- - ~>
|
|
45
60
|
- !ruby/object:Gem::Version
|
|
61
|
+
hash: 7
|
|
62
|
+
segments:
|
|
63
|
+
- 0
|
|
64
|
+
- 6
|
|
46
65
|
version: "0.6"
|
|
47
66
|
type: :development
|
|
48
67
|
version_requirements: *id003
|
|
@@ -54,6 +73,10 @@ dependencies:
|
|
|
54
73
|
requirements:
|
|
55
74
|
- - ~>
|
|
56
75
|
- !ruby/object:Gem::Version
|
|
76
|
+
hash: 15
|
|
77
|
+
segments:
|
|
78
|
+
- 2
|
|
79
|
+
- 6
|
|
57
80
|
version: "2.6"
|
|
58
81
|
type: :development
|
|
59
82
|
version_requirements: *id004
|
|
@@ -84,6 +107,7 @@ files:
|
|
|
84
107
|
- app/models/follow.rb
|
|
85
108
|
- lib/mongoid_followable.rb
|
|
86
109
|
- lib/mongoid_followable/followable.rb
|
|
110
|
+
- lib/mongoid_followable/follower.rb
|
|
87
111
|
- lib/mongoid_followable/version.rb
|
|
88
112
|
- mongoid_followable.gemspec
|
|
89
113
|
- spec/models/group.rb
|
|
@@ -104,17 +128,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
104
128
|
requirements:
|
|
105
129
|
- - ">="
|
|
106
130
|
- !ruby/object:Gem::Version
|
|
131
|
+
hash: 3
|
|
132
|
+
segments:
|
|
133
|
+
- 0
|
|
107
134
|
version: "0"
|
|
108
135
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
136
|
none: false
|
|
110
137
|
requirements:
|
|
111
138
|
- - ">="
|
|
112
139
|
- !ruby/object:Gem::Version
|
|
140
|
+
hash: 3
|
|
141
|
+
segments:
|
|
142
|
+
- 0
|
|
113
143
|
version: "0"
|
|
114
144
|
requirements: []
|
|
115
145
|
|
|
116
146
|
rubyforge_project: mongoid_followable
|
|
117
|
-
rubygems_version: 1.
|
|
147
|
+
rubygems_version: 1.4.1
|
|
118
148
|
signing_key:
|
|
119
149
|
specification_version: 3
|
|
120
150
|
summary: adds following feature to models
|