有一个包含列(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/