Dobra, wierzę, że w końcu to rozgryzłem.
„Ponieważ wartość id jest tworzona przez MySQL, chciałbym ustawić/utworzyć/utrzymać pole id w ruby tak, aby puts dog.id
nie będzie pustym ciągiem."
=> ponieważ wartość id jest automatycznie przypisywana w MySQL, Ruby nie ma możliwości poznania tej wartości i dlatego wywołanie dog.id zwróci pusty ciąg.
=> Muszę znaleźć sposób na mapowanie wartości identyfikatora obiektu w ruby tak, aby był taki sam, jak identyfikator automatycznie przypisany do obiektu po wstawieniu go do bazy danych MySQL.
=> Zwróć uwagę na stwierdzenie używane do tworzenia psów stołowych:
CREATE TABLE dogs(
id INT PRIMARY KEY AUTO_INCREMENT,
name TEXT,
color TEXT
);
przekłada się na to, że każdy pies ma swój identyfikator (który jest mu automatycznie przypisywany), imię i kolor. Istnieją dwa podejścia do myślenia o przechowywaniu informacji o przedmiotach psa:
dog = { "id" => 'some integer', "name" => "simba", "color" => "grey" }
dog = [1, "simba", "grey"]
Zwykle lubię używać tablic do przechowywania informacji, ale tym razem użyłem skrótu (ponieważ kiedy wywołuję .inspect on dog (nie Dog), wynik jest mniej więcej taki:
#<Dog:0x007fbf74c55068 @name="samba", @color="grey">
co kojarzy mi się z haszującą strukturą danych:
{ "id"=> 1, "name"=>"simba", "color"=>"grey"}
W Ruby robię to:
def row_hash(hash)
hash={}
Dog.new(hash[name], hash[color]).tap { |id| id = hash[id] }
end
Gdzie hash_row odnosi się do wiersza, który zawiera atrybut każdego obiektu psa. Dzięki temu Ruby wie, że za każdym razem, gdy tworzy nową instancję klasy Dog, powinien połączyć się z tą instancją i zmapować hash[id] na "id".
Dzięki temu mogę uzyskać dostęp do wartości „id” w ruby.
PS:Po prostu przyszło mi to do głowy. Prawdopodobnie edytuję tę odpowiedź po tym, jak przez jakiś czas będzie się przesiąkać.