在Sequel Pro中,使用以下语句创建了一个表:
CREATE TABLE dogs(
id INT PRIMARY KEY AUTO_INCREMENT,
name TEXT,
color TEXT
);
由于MySQL正在创建id
值,我想在ruby中设置/创建/维护id
字段,以便puts dog.id
不是空字符串。
想知道这段代码是否会实现这一点:
def new_from_hash(hash)
Dog.new(hash["name"], hash["color"]).tap {|dog| dog.id = hash["id"]}
end
注意:我没有运行rails;只是简单的红宝石,宝石mysql2和Sequel Pro。
谢谢!
答案 0 :(得分:0)
好的,我相信我终于弄明白了。
“由于id值是由MySQL创建的,我想在ruby中设置/创建/维护id字段,以便puts dog.id
不是空字符串。”
=>因为在MySQL中自动分配了id值Ruby无法知道id值是什么,因此调用dog.id将返回一个空字符串。
=>我需要找到一种方法来在ruby中映射对象的id值,这样当我将它插入MySQL数据库时,它与自动分配给对象的id相同。
=>注意用于创建表狗的语句:
CREATE TABLE dogs(
id INT PRIMARY KEY AUTO_INCREMENT,
name TEXT,
color TEXT
);
它转换为每个狗创建一个id(自动分配给它),名称和颜色。有两种方法可以考虑存储狗对象的信息:
dog = { "id" => 'some integer', "name" => "simba", "color" => "grey" }
dog = [1, "simba", "grey"]
我通常喜欢使用数组来存储信息,但这次我使用了一个哈希(因为当我在dog(而不是Dog)上调用.inspect时,结果是这样的:
#<Dog:0x007fbf74c55068 @name="samba", @color="grey">
这让我想到了哈希数据结构:
{ "id"=> 1, "name"=>"simba", "color"=>"grey"}
在Ruby中,我这样做:
def row_hash(hash)
hash={}
Dog.new(hash[name], hash[color]).tap { |id| id = hash[id] }
end
其中hash_row是指包含每个dog对象属性的行。这基本上让Ruby知道每次实例化Dog类的新实例时,它应该进入该实例化并将hash [id]映射到“id”。
这样做可以让我在ruby中访问“id”的值。
PS:这件事刚发生在我身上。我可能会在它渗透一段时间后编辑这个答案。