2016-06-16 4 views
1

列(ID、タイル、価格、説明、ショップID、タイムスタンプ)付きの '製品'テーブルがあります 列価格とショップIDは動的です。残りの列は静的です。Rails Postgres hstoreまたは多対多関係を格納するjsonb

また、列(ID、名前、タイムスタンプ)を持つテーブル「ショップ」もあります。

ショップには多数の製品があります。商品はすべてのショップと商品間で移行できます。ショップIDは空白にすることができます。

店舗にあった商品の履歴があります。たとえば、昨日のショップでは商品とその価格がありました。昨日の店の前日には、他の商品や価格がありました。だから、私は

'ShopHistory'(ID、データ、日付、タイムスタンプ)のようなものを持っています。ここで、データはhstoreまたはjsonです。したがって、{key:value}のようなハッシュを持つ必要があります.keyはproductのidで、valueは現在の価格です。しかし、製品のタイトルと説明を知るために、製品とデータ列を結合したいと考えています。私はそれをどうやって行うのか分かりません。 ShopHistoryはショップと商品の間の結合テーブルですが、すべての情報は1つの行に格納されているようです。

私は私を助けることができますか?おそらく、誰もがこれを実装するより良い方法を知っているかもしれません。どんな考えや記事も大歓迎です。

ありがとうございます!

P.S.私はレール(ActiveRecord)とPostgreSQLを使用していますが、Postgresだけを知っている人からの回答も私にとっては良いものです。

答えて

1

私はあなたの意思を得ていますが、率直に言って私はそれがあなたにとって簡単で簡単な方法でうまくいくとは思わないのです。 (経験則として、ルビーとレールでは、それが簡単でない場合は、おそらくルビー/レールのやり方ではないでしょう)。

なぜこれを知っていますか?よりよい解決策として

Can I use ActiveRecord relationships with fields from an Hstore?

(最後に私のために働いたものを)検討してください:私はあなたがhstoreのと何をしたいのかに非常によく似たことを行う前に、運を試してみましたので中間モデルをShopからProductに一致させる(おそらく、この中間モデルの名前をとし、結合テーブルshops_productsとしますが、その名前はあなた次第です)、中間モデルを使用して両方のモデルに参加しますa has_manythrough:関係をここに詳しく説明します:

同様

何か:

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 スコープを使用することができると思いますあなたは解決する必要があります(つまり、過去の1日の価格を見つける)。私のコードのすべてが生産準備ができてないテストではありませんが、私は私の例やリンクがあなたを上取得するのに十分であるべきだと思う

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 

スコープのようなクエリを実行するために、理想的には、あなたをできるようになります正しい道。

さらにヘルプが必要な場合はお知らせください。お手伝いできます。