lib/enumify/model.rb in enumify-0.0.2 vs lib/enumify/model.rb in enumify-0.0.3
- old
+ new
@@ -16,19 +16,21 @@
end
self.class_eval do
private
+
define_method "_set_#{parameter.to_s}" do |value, should_save|
value = value.to_sym
old = read_attribute(parameter) ? read_attribute(parameter).to_sym : nil
write_attribute(parameter, value.to_s)
save if should_save
send("#{parameter.to_s}_changed", old, value) if respond_to?("#{parameter.to_s}_changed", true) and old != value and !old.nil?
return value
end
+
end
opts.each do |opt|
raise "Collision in enum values method #{opt}" if respond_to?("#{opt.to_s}?") or respond_to?("#{opt.to_s}!") or respond_to?("#{opt.to_s}")
@@ -38,17 +40,24 @@
define_method "#{opt.to_s}!" do
send("_set_#{parameter.to_s}", opt, true)
end
-
scope opt.to_sym, where(parameter.to_sym => opt.to_s)
+ end
+
+ # We want to first define all the "positive" scopes and only then define
+ # the "negation scopes", to make sure they don't override previous scopes
+ opts.each do |opt|
# We need to prefix the field with the table name since if this scope will
# be used in a joined query with other models that have the same enum field then
# it will fail on ambiguous column name.
- scope "not_#{opt}".to_sym, where("#{self.table_name}.#{parameter} != ?", opt.to_s)
+ unless respond_to?("not_#{opt}")
+ scope "not_#{opt}", where("#{self.table_name}.#{parameter} != ?", opt.to_s)
+ end
end
end
end
+
end