# Descrição:
#   Valida que um atributo aninhado deve ser único dentro de uma lista.
# Utilização:
#   validates :atributo_aninhado, uniq_nested_attributes: {atributo: :chave_unica_do_atributo_aninhado, message: "elemento de despesa deve ser único dentro da subação."}

class UniqNestedAttributesValidator < ActiveModel::EachValidator
	def validate_each(record, attribute, collection)
		reject_conditions = Proc.new {|obj| obj.marked_for_destruction? || ( options[:atributo_valido] && !obj.send(options[:atributo_valido].to_s) )}

		objetos_repetidos = collection.to_a.reject(&reject_conditions).select{ |objeto|
			collection.to_a.reject(&reject_conditions).count{ |obj|
				obj.send(options[:atributo]) == objeto.send(options[:atributo])
			} > 1 if objeto.send(options[:atributo]).present?
		}

		objetos_repetidos.drop(1).each{ |objeto| objeto.errors[options[:atributo]] << options[:mensagem] }
		record.errors[attribute] << options[:mensagem] if objetos_repetidos.any?

	end
end
