47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
# File 'lib/slugable/has_slug.rb', line 47
def self.build(model, options)
options = options.reverse_merge(default_options)
from = options.delete(:from)
to = options.delete(:to)
formatter = options.delete(:formatter)
tree_cache_storage = options.delete(:tree_cache_storage)
to_slug_builder = options.delete(:to_slug_builder)
cache_layer = nil
if tree_cache_storage
cache_layer = Slugable::CacheLayer.new(tree_cache_storage, model)
builder_options = {
slug_column: to,
formatter: formatter,
cache: cache_layer
}
else
builder_options = {
slug_column: to,
formatter: formatter,
}
end
if to_slug_builder.nil?
builder = Slugable::SlugBuilder::Flat
if model.respond_to?(:ancestry_column)
if cache_layer
builder = Slugable::SlugBuilder::CachingTreeAncestry
else
builder = Slugable::SlugBuilder::TreeAncestry
end
end
to_slug_builder = builder.new(builder_options)
end
model.class_eval do
before_save :"prepare_slug_in_#{to}"
if cache_layer
after_save :"update_my_#{to}_cache"
end
define_method :"slug_builder_for_#{to}" do
to_slug_builder
end
define_method :"prepare_slug_in_#{to}" do
if public_send(to).blank? || formatter.call(public_send(to)).blank?
public_send(:"#{to}=", public_send(from))
end
public_send(:"#{to}=", formatter.call(public_send(to)))
end
define_method :"to_#{to}" do
public_send(:"slug_builder_for_#{to}").to_slug(self)
end
define_method :"to_#{to}_was" do
public_send(:"slug_builder_for_#{to}").to_slug_was(self)
end
define_method :"to_#{to}_will" do
public_send(:"slug_builder_for_#{to}").to_slug_will(self)
end
if cache_layer
define_method :"update_my_#{to}_cache" do
cache_layer.update(to, id, public_send(to))
end
end
end
end
|