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

标签 sql ruby-on-rails postgresql

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

还有一个包含列(id、名称、时间戳)的“商店”表。

商店有很多产品。产品可以在所有商店和产品之间迁移。shop_id 可以为空。

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

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

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

谢谢!

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

最佳答案

我明白你的意图,但坦率地说,我认为这不会以一种直接、简单的方式为你解决。 (根据经验,在 ruby​​ 和 rails 中,如果它不是直截了当的,那么您可能没有按照 ruby​​/rails 的方式进行操作)。

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

Can I use ActiveRecord relationships with fields from an Hstore?

作为更好的解决方案(最终对我有用),请考虑制作一个中间模型来匹配 Shop s 至 Product s,(也许你想将这个中间模型命名为类似 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 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

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

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

关于sql - Rails Postgres hstore 或 jsonb 存储多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37861059/

相关文章:

ruby-on-rails - 哪个日期时间选择器只适用于 active admin 0.5.0

ruby-on-rails - Ruby on Rails (jruby) 对现有数据库不是很好吗?

sql - POSTGRES 将周列转为行?

sql:聚合函数和字符串连接/连接

sql - postgresql - 选择 4 列,其中 1 列需要过滤

mysql - 选择所有,除非 MYSQL 中的特定单元格值

sql - 使用数据透视表填充数据

sql - 如果日期重叠,则对行进行分组,并对它们进行排名

ruby-on-rails - Rails 3. 无法在任何来源中找到 libv8-3.3.10.4

asp.net - 使用 SQL 身份验证对 ASP.NET Web 应用程序进行 SQL 数据审核