##// END OF EJS Templates
Optimize the N+1 query in watcher_recipients. #5415...
Eric Davis -
r3689:d2f8feb7c59a
parent child
Show More
@@ -1,71 +1,72
1 # ActsAsWatchable
1 # ActsAsWatchable
2 module Redmine
2 module Redmine
3 module Acts
3 module Acts
4 module Watchable
4 module Watchable
5 def self.included(base)
5 def self.included(base)
6 base.extend ClassMethods
6 base.extend ClassMethods
7 end
7 end
8
8
9 module ClassMethods
9 module ClassMethods
10 def acts_as_watchable(options = {})
10 def acts_as_watchable(options = {})
11 return if self.included_modules.include?(Redmine::Acts::Watchable::InstanceMethods)
11 return if self.included_modules.include?(Redmine::Acts::Watchable::InstanceMethods)
12 send :include, Redmine::Acts::Watchable::InstanceMethods
12 send :include, Redmine::Acts::Watchable::InstanceMethods
13
13
14 class_eval do
14 class_eval do
15 has_many :watchers, :as => :watchable, :dependent => :delete_all
15 has_many :watchers, :as => :watchable, :dependent => :delete_all
16 has_many :watcher_users, :through => :watchers, :source => :user
16 has_many :watcher_users, :through => :watchers, :source => :user
17
17
18 named_scope :watched_by, lambda { |user_id|
18 named_scope :watched_by, lambda { |user_id|
19 { :include => :watchers,
19 { :include => :watchers,
20 :conditions => ["#{Watcher.table_name}.user_id = ?", user_id] }
20 :conditions => ["#{Watcher.table_name}.user_id = ?", user_id] }
21 }
21 }
22 attr_protected :watcher_ids, :watcher_user_ids
22 attr_protected :watcher_ids, :watcher_user_ids
23 end
23 end
24 end
24 end
25 end
25 end
26
26
27 module InstanceMethods
27 module InstanceMethods
28 def self.included(base)
28 def self.included(base)
29 base.extend ClassMethods
29 base.extend ClassMethods
30 end
30 end
31
31
32 # Returns an array of users that are proposed as watchers
32 # Returns an array of users that are proposed as watchers
33 def addable_watcher_users
33 def addable_watcher_users
34 self.project.users.sort - self.watcher_users
34 self.project.users.sort - self.watcher_users
35 end
35 end
36
36
37 # Adds user as a watcher
37 # Adds user as a watcher
38 def add_watcher(user)
38 def add_watcher(user)
39 self.watchers << Watcher.new(:user => user)
39 self.watchers << Watcher.new(:user => user)
40 end
40 end
41
41
42 # Removes user from the watchers list
42 # Removes user from the watchers list
43 def remove_watcher(user)
43 def remove_watcher(user)
44 return nil unless user && user.is_a?(User)
44 return nil unless user && user.is_a?(User)
45 Watcher.delete_all "watchable_type = '#{self.class}' AND watchable_id = #{self.id} AND user_id = #{user.id}"
45 Watcher.delete_all "watchable_type = '#{self.class}' AND watchable_id = #{self.id} AND user_id = #{user.id}"
46 end
46 end
47
47
48 # Adds/removes watcher
48 # Adds/removes watcher
49 def set_watcher(user, watching=true)
49 def set_watcher(user, watching=true)
50 watching ? add_watcher(user) : remove_watcher(user)
50 watching ? add_watcher(user) : remove_watcher(user)
51 end
51 end
52
52
53 # Returns true if object is watched by +user+
53 # Returns true if object is watched by +user+
54 def watched_by?(user)
54 def watched_by?(user)
55 !!(user && self.watcher_user_ids.detect {|uid| uid == user.id })
55 !!(user && self.watcher_user_ids.detect {|uid| uid == user.id })
56 end
56 end
57
57
58 # Returns an array of watchers' email addresses
58 # Returns an array of watchers' email addresses
59 def watcher_recipients
59 def watcher_recipients
60 notified = watchers.collect(&:user).select(&:active?)
60 notified = watcher_users.active
61
61 if respond_to?(:visible?)
62 if respond_to?(:visible?)
62 notified.reject! {|user| !visible?(user)}
63 notified.reject! {|user| !visible?(user)}
63 end
64 end
64 notified.collect(&:mail).compact
65 notified.collect(&:mail).compact
65 end
66 end
66
67
67 module ClassMethods; end
68 module ClassMethods; end
68 end
69 end
69 end
70 end
70 end
71 end
71 end
72 end
General Comments 0
You need to be logged in to leave comments. Login now