Rails Postgres hstore或jsonb存储多对多关系

时间:2016-06-16 13:42:17

标签: sql ruby-on-rails postgresql

有一张桌子'产品'列(id,tile,price,description,shop_id,timestamps) 柱价和shop_id是动态的。列的其余部分是静态的。

还有一张桌子' Shops'列(id,name,timestamps)。

商店有很多产品。产品可以在所有商店和产品之间迁移.shop_id可以是空白的。

我想了解一家商店有哪些产品的历史。例如,昨天商店有产品和价格。前天店铺有其他产品和/或其他价格。所以我想要像

这样的东西

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

我们可以帮助我吗?也许有人知道更好的方法来实现所有这一切。欢迎任何想法和文章。

谢谢!

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

1 个答案:

答案 0 :(得分:1)

我明白你的意图,但坦率地说,我不认为它会以一种简单易行的方式为你服务。 (根据经验,在红宝石和铁轨中,如果它不直接,你可能不会用红宝石/铁轨方式)。

为什么我知道这个?因为我之前尝试过与你想要用hstore做什么非常类似的东西,没有运气:

Can I use ActiveRecord relationships with fields from an Hstore?

作为一个更好的解决方案(最终对我有用),请考虑制作一个中间模型,以便将ShopProduct匹配,(也许您想要命名这个中间模型类似于Shop_product,带有连接表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 范围来解决您需要解决的第二个计算问题(即,查找过去每天的价格)。

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

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

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

如果您需要更多帮助,请告诉我,我可以尝试提供帮助。