【问题标题】:Storing hash that uses custom class in database in Ruby在Ruby的数据库中存储使用自定义类的哈希
【发布时间】:2015-04-17 22:37:34
【问题描述】:

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

我有一个包含数万种产品的产品 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。我是否正确初始化哈希?非常感谢您的任何建议!

【问题讨论】:

  • 你能详细说明为什么它需要是一个哈希吗?我建议将每个产品存储为 ActiveRecord 模型。
  • 您是如何使用 Feed 的?您是否真的想将提要作为哈希值保存在数据库中,或者这真的是一个关于如何缓存 api 响应的问题?

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


【解决方案1】:

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

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

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

    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'}
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-01
        • 2013-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多