有一张桌子'产品'列(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的人的回答对我也有好处。
答案 0 :(得分:1)
我明白你的意图,但坦率地说,我不认为它会以一种简单易行的方式为你服务。 (根据经验,在红宝石和铁轨中,如果它不直接,你可能不会用红宝石/铁轨方式)。
为什么我知道这个?因为我之前尝试过与你想要用hstore做什么非常类似的东西,没有运气:
Can I use ActiveRecord relationships with fields from an Hstore?
作为一个更好的解决方案(最终对我有用),请考虑制作一个中间模型,以便将Shop
与Product
匹配,(也许您想要命名这个中间模型类似于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
我的所有代码都没有生产就绪,也没有经过测试,但我认为我的示例和链接应足以让您走上正确的道路。
如果您需要更多帮助,请告诉我,我可以尝试提供帮助。