Commit 6c03d40f6716e39a90f8461a5504951c198ed55e
1 parent
fe0b6335
Exists in
master
and in
3 other branches
minor cleanup
Showing
2 changed files
with
140 additions
and
145 deletions
Show diff stats
lib/acts_as_followable.rb
1 | -require File.dirname(__FILE__) + '/follower_lib' | |
2 | - | |
3 | -module ActiveRecord #:nodoc: | |
4 | - module Acts #:nodoc: | |
5 | - module Followable | |
6 | - | |
7 | - def self.included(base) | |
8 | - base.extend ClassMethods | |
9 | - base.class_eval do | |
10 | - include FollowerLib | |
11 | - end | |
12 | - end | |
13 | - | |
14 | - module ClassMethods | |
15 | - def acts_as_followable | |
16 | - has_many :follows, :as => :followable, :dependent => :destroy | |
17 | - include ActiveRecord::Acts::Followable::InstanceMethods | |
18 | - end | |
19 | - end | |
20 | - | |
21 | - | |
22 | - # This module contains instance methods | |
23 | - module InstanceMethods | |
24 | - | |
25 | - # Returns the number of followers a record has. | |
26 | - def followers_count | |
27 | - self.follows.size | |
28 | - end | |
29 | - | |
30 | - # Returns the following records. | |
31 | - def followers | |
32 | - Follow.find(:all, :include => [:follower], :conditions => ["followable_id = ? AND followable_type = ?", | |
33 | - self.id, parent_class_name(self)]).collect {|f| f.follower } | |
34 | - end | |
35 | - | |
36 | - # Returns true if the current instance is followed by the passed record. | |
37 | - def followed_by?(follower) | |
38 | - Follow.find(:first, :conditions => ["followable_id = ? AND followable_type = ? AND follower_id = ? AND follower_type = ?", self.id, parent_class_name(self), follower.id, parent_class_name(follower)]) ? true : false | |
39 | - end | |
40 | - | |
41 | - end | |
42 | - | |
43 | - end | |
44 | - end | |
45 | -end | |
1 | +require File.dirname(__FILE__) + '/follower_lib' | |
2 | + | |
3 | +module ActiveRecord #:nodoc: | |
4 | + module Acts #:nodoc: | |
5 | + module Followable | |
6 | + | |
7 | + def self.included(base) | |
8 | + base.extend ClassMethods | |
9 | + base.class_eval do | |
10 | + include FollowerLib | |
11 | + end | |
12 | + end | |
13 | + | |
14 | + module ClassMethods | |
15 | + def acts_as_followable | |
16 | + has_many :follows, :as => :followable, :dependent => :destroy | |
17 | + include ActiveRecord::Acts::Followable::InstanceMethods | |
18 | + end | |
19 | + end | |
20 | + | |
21 | + | |
22 | + module InstanceMethods | |
23 | + | |
24 | + # Returns the number of followers a record has. | |
25 | + def followers_count | |
26 | + self.follows.size | |
27 | + end | |
28 | + | |
29 | + # Returns the following records. | |
30 | + def followers | |
31 | + Follow.find(:all, :include => [:follower], :conditions => ["followable_id = ? AND followable_type = ?", | |
32 | + self.id, parent_class_name(self)]).collect {|f| f.follower } | |
33 | + end | |
34 | + | |
35 | + # Returns true if the current instance is followed by the passed record. | |
36 | + def followed_by?(follower) | |
37 | + Follow.find(:first, :conditions => ["followable_id = ? AND followable_type = ? AND follower_id = ? AND follower_type = ?", self.id, parent_class_name(self), follower.id, parent_class_name(follower)]) ? true : false | |
38 | + end | |
39 | + | |
40 | + end | |
41 | + | |
42 | + end | |
43 | + end | |
44 | +end | ... | ... |
lib/acts_as_follower.rb
1 | -require File.dirname(__FILE__) + '/follower_lib' | |
2 | - | |
3 | -module ActiveRecord #:nodoc: | |
4 | - module Acts #:nodoc: | |
5 | - module Follower | |
6 | - | |
7 | - def self.included(base) | |
8 | - base.extend ClassMethods | |
9 | - base.class_eval do | |
10 | - include FollowerLib | |
11 | - end | |
12 | - end | |
13 | - | |
14 | - module ClassMethods | |
15 | - def acts_as_follower | |
16 | - has_many :follows, :as => :follower, :dependent => :destroy | |
17 | - include ActiveRecord::Acts::Follower::InstanceMethods | |
18 | - end | |
19 | - end | |
20 | - | |
21 | - # This module contains instance methods | |
22 | - module InstanceMethods | |
23 | - | |
24 | - # Returns true if this instance is following the object passed as an argument. | |
25 | - def following?(followable) | |
26 | - 0 < Follow.count(:all, :conditions => [ | |
27 | - "follower_id = ? AND follower_type = ? AND followable_id = ? AND followable_type = ?", | |
28 | - self.id, parent_class_name(self), followable.id, parent_class_name(followable) | |
29 | - ]) | |
30 | - end | |
31 | - | |
32 | - # Returns the number of objects this instance is following. | |
33 | - def follow_count | |
34 | - Follow.count(:all, :conditions => ["follower_id = ? AND follower_type = ?", self.id, parent_class_name(self)]) | |
35 | - end | |
36 | - | |
37 | - # Creates a new follow record for this instance to follow the passed object. | |
38 | - # Does not allow duplicate records to be created. | |
39 | - def follow(followable) | |
40 | - follow = get_follow(followable) | |
41 | - unless follow | |
42 | - Follow.create(:followable => followable, :follower => self) | |
43 | - end | |
44 | - end | |
45 | - | |
46 | - # Deletes the follow record if it exists. | |
47 | - def stop_following(followable) | |
48 | - follow = get_follow(followable) | |
49 | - if follow | |
50 | - follow.destroy | |
51 | - end | |
52 | - end | |
53 | - | |
54 | - # TODO: Remove from public API. | |
55 | - # Returns the follow records related to this instance by type. | |
56 | - def follows_by_type(followable_type) | |
57 | - Follow.find(:all, :conditions => ["follower_id = ? AND follower_type = ? AND followable_type = ?", self.id, parent_class_name(self), followable_type]) | |
58 | - end | |
59 | - | |
60 | - # TODO: Remove from public API. | |
61 | - # Returns the follow records related to this instance by type. | |
62 | - def all_follows | |
63 | - Follow.find(:all, :include => [:followable], :conditions => ["follower_id = ? AND follower_type = ?", self.id, parent_class_name(self)]) | |
64 | - end | |
65 | - | |
66 | - # Returns the actual records which this instance is following. | |
67 | - def all_following | |
68 | - all_follows.map { |f| f.followable } | |
69 | - end | |
70 | - | |
71 | - # Returns the actual records of a particular type which this record is following. | |
72 | - def following_by_type(followable_type) | |
73 | - #klass = eval(followable_type) # be careful with this. | |
74 | - #klass.find(:all, :joins => :follows, :conditions => ['follower_id = ? AND follower_type = ?', self.id, parent_class_name(self)]) | |
75 | - follows_by_type(followable_type).map { |f| f.followable } | |
76 | - end | |
77 | - | |
78 | - # Allows magic names on following_by_type | |
79 | - # e.g. following_users == following_by_type('User') | |
80 | - def method_missing(m, *args) | |
81 | - if m.to_s[/following_(.+)/] | |
82 | - #following_by_type(parent_class_name($1).classify) | |
83 | - following_by_type($1.singularize.classify) | |
84 | - else | |
85 | - super | |
86 | - end | |
87 | - end | |
88 | - | |
89 | - private | |
90 | - | |
91 | - # Returns a follow record for the current instance and followable object. | |
92 | - def get_follow(followable) | |
93 | - Follow.find(:first, :conditions => ["follower_id = ? AND follower_type = ? AND followable_id = ? AND followable_type = ?", self.id, parent_class_name(self), followable.id, parent_class_name(followable)]) | |
94 | - end | |
95 | - | |
96 | - end | |
97 | - | |
98 | - end | |
99 | - end | |
100 | -end | |
1 | +require File.dirname(__FILE__) + '/follower_lib' | |
2 | + | |
3 | +module ActiveRecord #:nodoc: | |
4 | + module Acts #:nodoc: | |
5 | + module Follower | |
6 | + | |
7 | + def self.included(base) | |
8 | + base.extend ClassMethods | |
9 | + base.class_eval do | |
10 | + include FollowerLib | |
11 | + end | |
12 | + end | |
13 | + | |
14 | + module ClassMethods | |
15 | + def acts_as_follower | |
16 | + has_many :follows, :as => :follower, :dependent => :destroy | |
17 | + include ActiveRecord::Acts::Follower::InstanceMethods | |
18 | + end | |
19 | + end | |
20 | + | |
21 | + module InstanceMethods | |
22 | + | |
23 | + # Returns true if this instance is following the object passed as an argument. | |
24 | + def following?(followable) | |
25 | + 0 < Follow.count(:all, :conditions => [ | |
26 | + "follower_id = ? AND follower_type = ? AND followable_id = ? AND followable_type = ?", | |
27 | + self.id, parent_class_name(self), followable.id, parent_class_name(followable) | |
28 | + ]) | |
29 | + end | |
30 | + | |
31 | + # Returns the number of objects this instance is following. | |
32 | + def follow_count | |
33 | + Follow.count(:all, :conditions => ["follower_id = ? AND follower_type = ?", self.id, parent_class_name(self)]) | |
34 | + end | |
35 | + | |
36 | + # Creates a new follow record for this instance to follow the passed object. | |
37 | + # Does not allow duplicate records to be created. | |
38 | + def follow(followable) | |
39 | + follow = get_follow(followable) | |
40 | + unless follow | |
41 | + Follow.create(:followable => followable, :follower => self) | |
42 | + end | |
43 | + end | |
44 | + | |
45 | + # Deletes the follow record if it exists. | |
46 | + def stop_following(followable) | |
47 | + follow = get_follow(followable) | |
48 | + if follow | |
49 | + follow.destroy | |
50 | + end | |
51 | + end | |
52 | + | |
53 | + # TODO: Remove from public API. | |
54 | + # Returns the follow records related to this instance by type. | |
55 | + def follows_by_type(followable_type) | |
56 | + Follow.find(:all, :conditions => ["follower_id = ? AND follower_type = ? AND followable_type = ?", self.id, parent_class_name(self), followable_type]) | |
57 | + end | |
58 | + | |
59 | + # TODO: Remove from public API. | |
60 | + # Returns the follow records related to this instance by type. | |
61 | + def all_follows | |
62 | + Follow.find(:all, :include => [:followable], :conditions => ["follower_id = ? AND follower_type = ?", self.id, parent_class_name(self)]) | |
63 | + end | |
64 | + | |
65 | + # Returns the actual records which this instance is following. | |
66 | + def all_following | |
67 | + all_follows.map { |f| f.followable } | |
68 | + end | |
69 | + | |
70 | + # Returns the actual records of a particular type which this record is following. | |
71 | + def following_by_type(followable_type) | |
72 | + follows_by_type(followable_type).map { |f| f.followable } | |
73 | + end | |
74 | + | |
75 | + # Allows magic names on following_by_type | |
76 | + # e.g. following_users == following_by_type('User') | |
77 | + def method_missing(m, *args) | |
78 | + if m.to_s[/following_(.+)/] | |
79 | + following_by_type($1.singularize.classify) | |
80 | + else | |
81 | + super | |
82 | + end | |
83 | + end | |
84 | + | |
85 | + private | |
86 | + | |
87 | + # Returns a follow record for the current instance and followable object. | |
88 | + def get_follow(followable) | |
89 | + Follow.find(:first, :conditions => ["follower_id = ? AND follower_type = ? AND followable_id = ? AND followable_type = ?", self.id, parent_class_name(self), followable.id, parent_class_name(followable)]) | |
90 | + end | |
91 | + | |
92 | + end | |
93 | + | |
94 | + end | |
95 | + end | |
96 | +end | ... | ... |