Commit 4d1b6e6745061d6853885d933bdc4c01a4acf0e8

Authored by Braulio Bhavamitra
1 parent 9cd86716

Move path methods into PathMethods

Showing 1 changed file with 80 additions and 67 deletions   Show diff stats
lib/acts_as_filesystem.rb
@@ -17,12 +17,15 @@ module ActsAsFileSystem @@ -17,12 +17,15 @@ module ActsAsFileSystem
17 # a filesystem is a tree 17 # a filesystem is a tree
18 acts_as_tree :counter_cache => :children_count 18 acts_as_tree :counter_cache => :children_count
19 19
20 - include InstanceMethods  
21 extend ClassMethods 20 extend ClassMethods
  21 + include InstanceMethods
  22 + if self.has_path?
  23 + after_update :update_children_path
  24 + before_create :set_path
  25 + include InstanceMethods::PathMethods
  26 + end
22 27
23 - before_create :set_path  
24 before_save :set_ancestry 28 before_save :set_ancestry
25 - after_update :update_children_path  
26 end 29 end
27 30
28 end 31 end
@@ -43,26 +46,14 @@ module ActsAsFileSystem @@ -43,26 +46,14 @@ module ActsAsFileSystem
43 #raise "Couldn't reach and set ancestry on every record" if self.base_class.count(:conditions => ['ancestry is null']) != 0 46 #raise "Couldn't reach and set ancestry on every record" if self.base_class.count(:conditions => ['ancestry is null']) != 0
44 end 47 end
45 48
  49 + def has_path?
  50 + (['name', 'slug', 'path'] - self.column_names).blank?
  51 + end
  52 +
46 end 53 end
47 54
48 module InstanceMethods 55 module InstanceMethods
49 56
50 - # used to know when to trigger batch renaming  
51 - attr_accessor :recalculate_path  
52 -  
53 - # calculates the full path to this record using parent's path.  
54 - def calculate_path  
55 - self.hierarchy.map{ |obj| obj.slug }.join('/')  
56 - end  
57 - def set_path  
58 - if self.path == self.slug && !self.top_level?  
59 - self.path = self.calculate_path  
60 - end  
61 - end  
62 - def explode_path  
63 - path.split(/\//)  
64 - end  
65 -  
66 def ancestry_column 57 def ancestry_column
67 'ancestry' 58 'ancestry'
68 end 59 end
@@ -95,17 +86,6 @@ module ActsAsFileSystem @@ -95,17 +86,6 @@ module ActsAsFileSystem
95 end 86 end
96 end 87 end
97 88
98 - def update_children_path  
99 - if self.recalculate_path  
100 - self.children.each do |child|  
101 - child.path = child.calculate_path  
102 - child.recalculate_path = true  
103 - child.save!  
104 - end  
105 - end  
106 - self.recalculate_path = false  
107 - end  
108 -  
109 # calculates the level of the record in the records hierarchy. Top-level 89 # calculates the level of the record in the records hierarchy. Top-level
110 # records have level 0; the children of the top-level records have 90 # records have level 0; the children of the top-level records have
111 # level 1; the children of records with level 1 have level 2, and so on. 91 # level 1; the children of records with level 1 have level 2, and so on.
@@ -196,51 +176,84 @@ module ActsAsFileSystem @@ -196,51 +176,84 @@ module ActsAsFileSystem
196 res 176 res
197 end 177 end
198 178
199 - # calculates the full name of a record by accessing the name of all its  
200 - # ancestors.  
201 - #  
202 - # If you have this record hierarchy:  
203 - # Record "A"  
204 - # Record "B"  
205 - # Record "C"  
206 - #  
207 - # Then Record "C" will have "A/B/C" as its full name.  
208 - def full_name(sep = '/')  
209 - self.hierarchy.map {|item| item.name || '?' }.join(sep)  
210 - end 179 + #####
  180 + # Path methods
  181 + # These methods are used when _path_, _name_ and _slug_ attributes exist
  182 + # and should be calculated based on the tree
  183 + #####
  184 + module PathMethods
  185 + # used to know when to trigger batch renaming
  186 + attr_accessor :recalculate_path
  187 +
  188 + # calculates the full path to this record using parent's path.
  189 + def calculate_path
  190 + self.hierarchy.map{ |obj| obj.slug }.join('/')
  191 + end
  192 + def set_path
  193 + if self.path == self.slug && !self.top_level?
  194 + self.path = self.calculate_path
  195 + end
  196 + end
  197 + def explode_path
  198 + path.split(/\//)
  199 + end
211 200
212 - # gets the name without leading parents. Useful when dividing records  
213 - # in top-level groups and full names must not include the top-level  
214 - # record which is already a emphasized label  
215 - def full_name_without_leading(count, sep = '/')  
216 - parts = self.full_name(sep).split(sep)  
217 - count.times { parts.shift }  
218 - parts.join(sep)  
219 - end 201 + def update_children_path
  202 + if self.recalculate_path
  203 + self.children.each do |child|
  204 + child.path = child.calculate_path
  205 + child.recalculate_path = true
  206 + child.save!
  207 + end
  208 + end
  209 + self.recalculate_path = false
  210 + end
220 211
221 - def set_name(value)  
222 - if self.name != value  
223 - self.recalculate_path = true 212 + # calculates the full name of a record by accessing the name of all its
  213 + # ancestors.
  214 + #
  215 + # If you have this record hierarchy:
  216 + # Record "A"
  217 + # Record "B"
  218 + # Record "C"
  219 + #
  220 + # Then Record "C" will have "A/B/C" as its full name.
  221 + def full_name(sep = '/')
  222 + self.hierarchy.map {|item| item.name || '?' }.join(sep)
224 end 223 end
225 - self[:name] = value  
226 - end  
227 224
228 - # sets the name of the record. Also sets #slug accordingly.  
229 - def name=(value)  
230 - self.set_name(value)  
231 - unless self.name.blank?  
232 - self.slug = self.name.to_slug 225 + # gets the name without leading parents. Useful when dividing records
  226 + # in top-level groups and full names must not include the top-level
  227 + # record which is already a emphasized label
  228 + def full_name_without_leading(count, sep = '/')
  229 + parts = self.full_name(sep).split(sep)
  230 + count.times { parts.shift }
  231 + parts.join(sep)
233 end 232 end
234 - end  
235 233
236 - # sets the slug of the record. Also sets the path with the new slug value.  
237 - def slug=(value)  
238 - self[:slug] = value  
239 - unless self.slug.blank?  
240 - self.path = self.calculate_path 234 + def set_name(value)
  235 + if self.name != value
  236 + self.recalculate_path = true
  237 + end
  238 + self[:name] = value
241 end 239 end
242 - end  
243 240
  241 + # sets the name of the record. Also sets #slug accordingly.
  242 + def name=(value)
  243 + self.set_name(value)
  244 + unless self.name.blank?
  245 + self.slug = self.name.to_slug
  246 + end
  247 + end
  248 +
  249 + # sets the slug of the record. Also sets the path with the new slug value.
  250 + def slug=(value)
  251 + self[:slug] = value
  252 + unless self.slug.blank?
  253 + self.path = self.calculate_path
  254 + end
  255 + end
  256 + end
244 end 257 end
245 end 258 end
246 259