Ok, credo di averlo finalmente capito.
"Dato che il valore id viene creato da MySQL, vorrei impostare/creare/mantenere il campo id in ruby in modo che puts dog.id
non sarà una stringa vuota."
=> perché il valore id viene assegnato automaticamente in MySQL Ruby non ha modo di sapere quale sia quel valore id e quindi chiamando dog.id restituirà una stringa vuota.
=> Ho bisogno di trovare un modo per mappare il valore dell'id di un oggetto in ruby in modo tale che sia lo stesso dell'id assegnato automaticamente all'oggetto quando lo inserisco nel database MySQL.
=> Presta attenzione all'istruzione utilizzata per creare i cani da tavola:
CREATE TABLE dogs(
id INT PRIMARY KEY AUTO_INCREMENT,
name TEXT,
color TEXT
);
si traduce in ogni cane creato ha un ID (che gli viene assegnato automaticamente), un nome e un colore. Esistono due approcci per pensare all'archiviazione delle informazioni sugli oggetti di un cane:
dog = { "id" => 'some integer', "name" => "simba", "color" => "grey" }
dog = [1, "simba", "grey"]
In genere mi piace usare gli array per memorizzare informazioni, ma questa volta ho usato un hash (perché quando chiamo .inspect on dog (non Dog) il risultato è qualcosa del genere:
#<Dog:0x007fbf74c55068 @name="samba", @color="grey">
il che mi fa pensare a una struttura di dati hash:
{ "id"=> 1, "name"=>"simba", "color"=>"grey"}
In Ruby, faccio questo:
def row_hash(hash)
hash={}
Dog.new(hash[name], hash[color]).tap { |id| id = hash[id] }
end
Dove hash_row si riferisce alla riga che contiene l'attributo di ogni oggetto cane. Questo fondamentalmente fa sapere a Ruby che ogni volta che istanzia una nuova istanza della classe Dog dovrebbe attingere a quell'istanza e mappare hash[id] su "id".
In questo modo posso accedere al valore di "id" in ruby.
PS:Mi è appena venuto in mente. Probabilmente modificherò questa risposta dopo che sarà filtrata per un po'.