Commit 4d1b6e6745061d6853885d933bdc4c01a4acf0e8
1 parent
9cd86716
Exists in
master
and in
29 other branches
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 |