Skip to content

Instantly share code, notes, and snippets.

@neves
Created August 15, 2008 15:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save neves/5582 to your computer and use it in GitHub Desktop.
Save neves/5582 to your computer and use it in GitHub Desktop.
=begin
o objetivo abaixo é trazer para o Rails 2.1 o recurso de atribuir um Hash e ele criar a entidade.
Ao invés de: pessoa.endereco_residencial = Endereco.new(:cep => 12345678)
fazer: pessoa.endereco_residencial = {:cep => 12345678}
para facilitar uso de submodel em form: Pessoa has_one EnderecoResidencial
mas ao mesmo tempo, tratar as seguintes característica:
Se não tiver endereço, cria ao atribuir hash ou objeto.
Se já tiver endereço e atribuir um hash vazio ou um endereco vazio, apagar o relacionamento.
Se atribuir um hash não vazio e já tiver endereço, faz update, ao invés de destruir e criar dinovo.
=end
# @TODO: transformar em um plugin
# @TODO: verificar o comportamento no Rails Edge, que parece que a cada update, o objeto é destruído e construído um novo.
def endereco_residencial_with_hash=(end_or_hash)
if end_or_hash.is_a? Endereco
self.endereco_residencial_without_hash = end_or_hash.vazio? ? nil : end_or_hash
elsif end_or_hash.nil?
self.endereco_residencial_without_hash = nil
elsif end_or_hash.is_a? Hash
#self.endereco_residencial = EnderecoResidencial.new end_or_hash
if end_or_hash.values.all?(&:empty?)
self.endereco_residencial = nil
else
if self.endereco_residencial.nil?
self.endereco_residencial = EnderecoResidencial.new end_or_hash
else
self.endereco_residencial.update_attributes(end_or_hash)
end
end
end
end
alias_method_chain :endereco_residencial=, :hash
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment