Compreendendo o Ruby on Rails ActiveRecord Model Acessores
-
22-09-2019 - |
Pergunta
Meu modelo, "DataFile", tem um monte de campos que eu gostaria de definir de fora do modelo, por exemplo
file = DataFile.new file.owner = 123
Agora, até onde eu sei, eu teria que colocar um "att_accessor: campo" no meu modelo, para todos os campos que eu gostaria de modificar de fora. No entanto, o código acima funciona bem sem ter nenhum att_accessor definido, definindo o campo proprietário como 123. Por que isso?
Eu esperava obter um erro "Método não definido" ou algo parecido.
Solução
Como o ORM do Rails usa o padrão ActiveRecord, dois métodos são criados automaticamente para cada coluna no banco de dados associado a essa tabela: nome da coluna, e columnName =. Isso acontece "automaticamente" como resultado do seu modelo herdando do ActiveRecord :: Base. Esses métodos são definidos usando as instalações de metaprogramação do Ruby e são criados dinamicamente no momento da criação de classe.
Para obter mais informações sobre exatamente o que está acontecendo, eu daria uma olhada na fonte do Rails. No entanto, o exposto acima provavelmente é suficiente para lhe dar uma compreensão de trabalho do que está acontecendo.
Outras dicas
Drew e Zepplock acertaram, mas vou adicionar mais uma coisa. Os acessores que o Rails (na verdade, ActiveRecord) cria para campos de banco de dados não são acessadores de rubi e, se você usar o script/console, verá que o proprietário não é uma variável de instância do arquivo de objeto.
É provável que você nunca notasse isso até se aventurar nos acessores padrão e tentar manipular o @owner dentro de um método em arquivo. Se você está aprendendo Ruby ao mesmo tempo em que está aprendendo Rails (que é o que eu fiz), é provável que você esbarre nisso em algum momento. Esta é a razão pela qual você precisa escrever:
class MyClass < ActiveRecord::Base
def invalidate_owner
self.owner = owner << " no longer owns this"
save
end
end
ao invés de
class MyClass < ActiveRecord::Base
def invalidate_owner
self.owner << " no longer owns this"
save
end
end
Provavelmente "proprietário" faz parte do seu modelo de banco de dados. Os acessores dos campos de banco de dados são gerados automaticamente para você.