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.

Foi útil?

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ê.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top