Eu enviei meu primeiro PR Rails hoje. Há um exemplo de uso de cláusula de proteção que eu acho que merece uma descrição:
Meu primeiro código parecia com este:
def check_validity!
if through_reflection.nil?
raise HasManyThroughAssociationNotFoundError.new(active_record.name, self)
end
if through_reflection.polymorphic?
raise HasManyThroughAssociationPolymorphicThroughError.new(active_record.name, self)
end
if has_one? && through_reflection.polymorphic?
raise HasOneAssociationPolymorphicThroughError.new(active_record.name, self)
end
...
check_validity_of_inverse!
end
Isso me deu uma especificação falha. A razão era que, se through_reflection.polymorphic?
fosse verdade, meu caso de has_one? && through_reflection.polymorphic?
nunca deveria ser motivo de preocupação.
Então mudei para cima:
def check_validity!
if through_reflection.nil?
raise HasManyThroughAssociationNotFoundError.new(active_record.name, self)
end
if has_one? && through_reflection.polymorphic?
raise HasOneAssociationPolymorphicThroughError.new(active_record.name, self)
end
if through_reflection.polymorphic?
raise HasManyThroughAssociationPolymorphicThroughError.new(active_record.name, self)
end
...
check_validity_of_inverse!
end
Código funcionou. Especificações aprovadas. É hora de refatorar um pouco:
def check_validity!
if through_reflection.nil?
raise HasManyThroughAssociationNotFoundError.new(active_record.name, self)
end
if through_reflection.polymorphic?
raise HasManyThroughAssociationPolymorphicThroughError.new(active_record.name, self) if has_one?
raise HasOneAssociationPolymorphicThroughError.new(active_record.name, self)
end
...
check_validity_of_inverse!
end
Mucha melhor!