lib/ensurance.rb in ensurance-0.1.3 vs lib/ensurance.rb in ensurance-0.1.4

- old
+ new

@@ -14,25 +14,30 @@ @_ensure_by = nil end def ensure(thing = nil) return nil unless thing.present? + found = nil if thing.is_a?(self) return thing + elsif thing.is_a?(Array) + raise ArgumentError.new("Cannot Ensure #{self.name} with an Array: #{thing.inspect}") elsif thing.is_a?(GlobalID) return GlobalID::Locator.locate(thing) elsif thing.is_a?(Hash) && thing['_aj_globalid'] && (found = GlobalID::Locator.locate(thing['_aj_globalid'])) return found elsif thing.is_a?(String) && found = GlobalID::Locator.locate(thing) return found end - found = nil - @_ensure_by ||= [self.primary_key, @_additional_ensure_by].flatten.compact.uniq + @_ensure_by ||= [@_additional_ensure_by || self.primary_key].flatten.compact.uniq @_ensure_by.each do |ensure_field| - value = thing.try(:fetch, ensure_field.to_sym, nil) || thing.try(:fetch, ensure_field.to_s, nil) || thing - found = self.find_by(ensure_field => value) + value = thing + if thing.is_a?(Hash) + value = thing.fetch(ensure_field.to_sym, nil) || thing.fetch(ensure_field.to_s, nil) + end + found = self.find_by(ensure_field => value) if value.present? && !value.is_a?(Hash) break if found.is_a?(self) end found end