Class: FriendlyId::Tasks

Inherits:
Object
  • Object
show all
Defined in:
lib/friendly_id/tasks.rb

Class Method Summary collapse

Class Method Details

.delete_old_slugs(days = nil, class_name = nil) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
# File 'lib/friendly_id/tasks.rb', line 64

def delete_old_slugs(days = nil, class_name = nil)
  days = days.blank? ? 45 : days.to_i
  klass = class_name.blank? ? nil : parse_class_name(class_name.to_s)
  conditions = ["created_at < ?", DateTime.now - days.days]
  if klass
    conditions[0] << " AND sluggable_type = ?"
    conditions << klass.to_s
  end
  slugs = Slug.find :all, :conditions => conditions
  slugs.each { |s| s.destroy unless s.is_most_recent? }
end

.delete_slugs_for(klass) ⇒ Object



55
56
57
58
59
60
61
62
# File 'lib/friendly_id/tasks.rb', line 55

def delete_slugs_for(klass)
  klass = parse_class_name(klass)
  validate_uses_slugs(klass)
  Slug.destroy_all(["sluggable_type = ?", klass.to_s])
  if klass.cache_column
    klass.update_all("#{klass.cache_column} = NULL")
  end
end

.make_slugs(klass, options = {}) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
# File 'lib/friendly_id/tasks.rb', line 5

def make_slugs(klass, options = {})
  klass = parse_class_name(klass)
  validate_uses_slugs(klass)
  options = {:limit => 100, :include => :slugs, :conditions => "slugs.id IS NULL"}.merge(options)
  while records = klass.find(:all, options) do
    break if records.size == 0
    records.each do |r|
      r.save!
      yield(r) if block_given?
    end
  end
end

.make_slugs_faster(klass, options = {}) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/friendly_id/tasks.rb', line 18

def make_slugs_faster(klass, options = {})
  klass = parse_class_name(klass)
  validate_uses_slugs(klass)
  options = {:limit => 100, :include => :slugs, :conditions => "slugs.id IS NULL"}.merge(options)
  while records = klass.find(:all, options) do
    break if records.size == 0
    slugs = []
    records.each do |r|
      slug = r.slugs.build :name => r.slug_text
      slug.send :set_sequence
      r.instance_eval do
        if friendly_id_options[:scope]
          scope = send(friendly_id_options[:scope])
          slug.scope = scope.respond_to?(:to_param) ? scope.to_param : scope.to_s
        end
      end
      r.instance_eval do
        slugs.reverse.each do |mem_slug|
          if mem_slug.name == slug.name
            if friendly_id_options[:scope]
              slug.sequence = mem_slug.sequence + 1 if mem_slug.scope == slug.scope
              break
            else
              slug.sequence = mem_slug.sequence + 1
              break
            end
          end
        end
      end
      klass.update_all({:cached_slug => slug.to_friendly_id}, :id => r.id)
      slugs << slug
      yield(r) if block_given?
    end
    Slug.import slugs, :validate => false
  end
end

.parse_class_name(class_name) ⇒ Object



76
77
78
79
80
81
82
83
# File 'lib/friendly_id/tasks.rb', line 76

def parse_class_name(class_name)
  return class_name if class_name.class == Class
  if (class_name.split('::').size > 1)
    class_name.split('::').inject(Kernel) {|scope, const_name| scope.const_get(const_name)}
  else
    Object.const_get(class_name)
  end
end