存储在Ruby中使用数据库中的自定义类的哈希

时间:2015-02-17 08:55:29

标签: ruby-on-rails database serialization data-structures hash

有人可以为这个用例推荐一个好的数据结构/方式吗?我正在使用带有MySQL的Ruby / Rails。

我有一个包含数万种产品的产品Feed(包含价格,网址,产品代码等)。我每天访问一次Feed,并希望将产品信息存储到一个快速访问的哈希值中,该哈希值在程序停止运行后会一直存在于数据库中。

这个(可能是非常大的)哈希应该是它自己的类,还是Product类的序列化属性?

我的伪代码:

将产品Feed数据保存到哈希并存储在数据库中:

all_products_hash = Hash.new
product_feed = get_feed_api()
product_feed.for_each |product| do
    updated_product = Product.new(product.url, product.code, product.price)
    all_products_hash[product.url] = updated_product
end

all_products_hash.save

检索哈希内容(不确定如何从数据库中检索哈希):

a_product = all_products_hash.get['url']

哈希的关键是product.url。我是否正确初始化哈希?非常感谢任何建议!

3 个答案:

答案 0 :(得分:2)

不要使用哈希。您可以将SQLite与文件存储一起使用,这也将允许您查询,基本索引等。如果您关注内存与文件存储性能,请阅读Quickly dumping a database in memory to file

作为ruby sqlite连接器,您可以使用https://github.com/sparklemotion/sqlite3-ruby

希望有所帮助。

答案 1 :(得分:1)

我认为这就是您所寻找的,但如果我错了,您可能需要详细说明问题。

hash = {}
result = ActiveRecord::Base.connection.execute('YOUR QUERY HERE')
while((r = result).present?)
  hash[r.url] = r
end

或者(但慢慢地)

hash = {}
Product.all.each do |p|
  hash[p.url] = p.attributes
end

假设该表包含id,url,code,price;它应该是这样的:

{
'www.whatever.com' => {id: 1, url: 'www.whatever.com', code:'123', price: '123'}
'www.whatever2.com' => {id: 2, url: 'www.whatever2.com', code:'321', price: '321'}
}

答案 2 :(得分:1)

取决于该哈希的数据结构。我们是在谈论一个非常复杂的结构(嵌入式结构)还是一个简单的键/值。

如果复杂拉出关键信息并将其存储在列(id,sku,name,description ..)中。如果足够大,其余部分可以存储在varchar字段中。然后你可以序列化/反序列化为hash / json字符串。

如果它是一个简单的结构,我会创建一个模型来表示它。