Um exemplo do que estou falando:
class Person < ActiveRecord::Base
def name=(name)
super(name.capitalize)
end
def name
super().downcase # not sure why you'd do this; this is just an example
end
end
Isso parece funcionar, mas acabei de ler a seção sobre substituição de métodos de atributo nos documentos ActiveRecord :: Base , e sugere o uso dos métodos read_attribute
e write_attribute
. Eu pensei que deveria haver algo errado com o que estou fazendo no exemplo acima; caso contrário, por que eles abençoariam esses métodos como o "caminho certo" para substituir os métodos de atributo? Eles também estão forçando uma linguagem muito mais feia, então deve haver uma boa razão ...
Minha verdadeira pergunta: há algo de errado com este exemplo?
ruby-on-rails
oop
activerecord
Ajedi32
fonte
fonte
Como uma extensão da resposta de Aaron Longwell, você também pode usar uma "notação de hash" para acessar atributos que substituíram acessadores e mutadores:
fonte
self.attribute
atualiza a pilha no 3.2.16.||=
por padrão:def name; self[:name] ||= 'anon'; end
Há ótimas informações disponíveis sobre esse tópico em http://errtheblog.com/posts/18-accessor-missing .
O longo e curto disso é que o ActiveRecord manipula corretamente super chamadas para acessadores de atributo do ActiveRecord.
fonte
Eu tenho um plug-in rails que faz com que a substituição de atributos funcione como super, como seria de esperar. Você pode encontrá-lo no github .
Para instalar:
Usar:
Depois de fazer isso, as coisas simplesmente funcionam:
fonte