【问题标题】:Rails Postgres hstore or jsonb to store many to many relationsRails Postgres hstore 或 jsonb 存储多对多关系
【发布时间】:2016-10-18 01:56:49
【问题描述】:

有一个包含列(id、tile、price、description、shop_id、timestamps)的“Products”表 列 price 和 shop_id 是动态的。列的其余部分是静态的。

还有一个包含列(id、name、timestamps)的“Shops”表。

商店有很多产品。产品可以在所有店铺之间迁移,products.shop_id 可以为空。

我想了解商店拥有哪些产品的历史记录。例如,昨天商店有产品及其价格。前天商店有其他产品和/或其他价格。所以我想要类似的东西

'ShopHistory'(id、数据、日期、时间戳),其中数据是 hstore 或 json。所以它应该有像 {key: value} 这样的哈希,其中 key 是产品的 id,value 是它的当前价格。但我想将数据列与产品连接起来,以了解产品的标题和描述。我不知道该怎么做。 看起来 ShopHistory 是 shop 和 products 之间的连接表,但所有信息都存储在一行中。

我们能帮帮我吗?也许有人知道实现所有这些的更好方法。欢迎任何想法和文章。

谢谢!

附:我使用 rails(ActiveRecord) 和 PostgreSQL,但只知道 Postgres 的人的回答对我也有好处。

【问题讨论】:

    标签: sql ruby-on-rails postgresql


    【解决方案1】:

    我明白你的意图,但坦率地说,我认为这不会以一种直接、简单的方式对你有用。 (根据经验,在 ruby​​ 和 rails 中,如果它不简单,您可能不会使用 ruby​​/rails 方式)。

    我为什么知道这个?因为我之前尝试过做与你想用 hstore 做的事情非常相似的事情,但没有运气:

    Can I use ActiveRecord relationships with fields from an Hstore?

    作为一个更好的解决方案(最终对我来说是什么),请考虑制作一个中间模型来匹配 Shops 到 Products,(也许你会想将此中间模型命名为 @ 987654325@,带有连接表 shops_products,但名称由您决定)然后使用带有 has_many through: 关系的中间模型连接两个模型,详情如下:

    http://edgeguides.rubyonrails.org/association_basics.html#the-has-many-through-association

    类似:

    class Shop << ActiveRecord::Base
      has_many :shop_products
      has_many :products, through: :shop_products
    end
    
    class ShopProduct << ActiveRecord::Base
      belongs_to :shop
      belongs_to :product
    end
    
    class Product << ActiveRecord::Base
      has_many :shop_products
      has_many :shops, through: :products
    

    (关于如何在链接中创建所有这些的更多信息,我建议阅读)

    现在您将建立一个关联,因此您可以获得:

    Shop.find_by_id(1).products
    Product.find_by_id(1).shops
    

    最后,我认为你可以使用 ActiveRecord scopes 来解决你需要解决的第二个计算问题(即求过去每天的价格)。

    理想情况下,范围将允许您执行以下查询:

    Shop.products.active_yesterday
    
    class Product << ActiveRecord::Base
    
      scope active_yesterday -> { where('updated_at BETWEEN ? AND ?', 1.day.ago.beginning_of_day, 1.day.ago.end_of_day) }
    
      has_many :shop_products
      has_many :shops, through: :shop_products
    end
    

    我的所有代码都不是生产就绪的,也没有经过测试,但我认为我的示例和链接应该足以让你走上正确的道路。

    如果您需要更多帮助,请告诉我,我会尽力提供帮助。

    【讨论】:

    • 对于特定情况,我使用 JSON 而不是 ActiveRecord。我写了一个 ruby​​ 库对象来处理这个逻辑。
    猜你喜欢
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    相关资源
    最近更新 更多