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