Ok, eu acredito que finalmente descobri isso.
"Como o valor id está sendo criado pelo MySQL, gostaria de definir/criar/manter o campo id em ruby para que
puts dog.id
não será uma string vazia." => porque o valor do id é atribuído automaticamente no MySQL, Ruby não tem como saber qual é o valor desse id e, portanto, chamar dog.id retornará uma string vazia.
=> Preciso encontrar uma maneira de mapear o valor de id de um objeto em ruby de forma que seja o mesmo que o id atribuído automaticamente ao objeto quando o insiro no banco de dados MySQL.
=> Preste atenção no comando usado para criar os Table dogs:
CREATE TABLE dogs(
id INT PRIMARY KEY AUTO_INCREMENT,
name TEXT,
color TEXT
);
ele traduz para cada criação de cachorro tem um id (que é automaticamente atribuído a ele), um nome e uma cor. Existem duas abordagens para pensar no armazenamento das informações de um objeto cão:
dog = { "id" => 'some integer', "name" => "simba", "color" => "grey" }
dog = [1, "simba", "grey"]
Normalmente, gosto de usar arrays para armazenar informações, mas desta vez usei um hash (porque quando chamo .inspect on dog (não Dog) o resultado é algo assim:
#<Dog:0x007fbf74c55068 @name="samba", @color="grey">
o que me faz pensar em uma estrutura de dados hash:
{ "id"=> 1, "name"=>"simba", "color"=>"grey"}
Em Ruby, eu faço isso:
def row_hash(hash)
hash={}
Dog.new(hash[name], hash[color]).tap { |id| id = hash[id] }
end
Onde hash_row se refere à linha que contém o atributo de cada objeto dog. Isso basicamente permite que o Ruby saiba que cada vez que instanciar uma nova instância da classe Dog, ele deve acessar essa instanciação e mapear hash[id] para "id".
Fazer isso me permite acessar o valor de "id" em ruby.
PS:Isso acabou de me ocorrer. Provavelmente editarei esta resposta depois que ela se infiltrar por um tempo.