2016-06-16 5 views
1

Существует таблица «Продукты» с колонками (id, плитка, цена, описание, shop_id, временные метки) Цена колонки и shop_id являются динамическими. Остальная часть столбца статична.Rails Postgres hstore или jsonb для хранения многих-многих отношений

Также есть таблица «Магазины» с колонками (id, name, timestamps).

В магазине много товаров. Продукт может мигрировать среди всех магазинов и продуктов. Shop_id может быть пустым.

Я хочу иметь историю о том, какие продукты есть в магазине. Например, вчерашний магазин имел продукты и их цены. Позавчера магазин имел другие продукты и/или другие их цены. Поэтому я хочу иметь что-то вроде

«ShopHistory» (id, data, date, timestamps), где данные hstore или json. Поэтому он должен иметь хеш, например {key: value}, где ключ - это идентификатор продукта, а значение - его текущая цена. Но я хотел бы присоединиться к столбцу данных с продуктами, чтобы узнать о названии и описании продуктов. Я не знаю, как это сделать. Похоже, ShopHistory представляет собой таблицу соединений между магазином и продуктами, но вся информация хранится в одной строке.

Можем ли мы мне помочь? Может быть, кто-нибудь знает лучший способ реализовать все это. Любые мысли и статьи приветствуются.

Спасибо!

P.S. Я использую рельсы (ActiveRecord) и PostgreSQL, но ответы от парней, которые знают только Postgres, тоже хороши для меня.

ответ

1

Я получаю ваше намерение, но, честно говоря, я не думаю, что это сработает для вас простым, простым способом. (Как правило, в рубине и в рельсах, если это не просто, вы, вероятно, не делаете это рубиновым/рельсовым способом).

Почему я знаю это? Потому что я пытался до того, чтобы сделать очень похожую вещь, что вы хотите сделать с hstore, не повезло:

Can I use ActiveRecord relationships with fields from an Hstore?

Как лучшего решения (то, что работал для меня в конце концов), пожалуйста, рассмотреть сделав промежуточную модель для соответствия Shop s с Product s (возможно, вы захотите назвать эту промежуточную модель примерно как Shop_product, с таблицей объединения shops_products, но это зависит от вас), затем присоедините обе модели, используя промежуточную модель с a has_manythrough: взаимосвязь, как подробно описано здесь:

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 прицелов решить вторую вычислительную задачу, что йо u нужно решить (то есть найти цену за день в прошлом).

Прицелы позволят вам, в идеале, делать запросы, как:

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 

Все мой код не является производством готового и не проверял, но я думаю, что мои примеры и ссылки должны быть достаточно, чтобы вы на правильный путь.

Дайте мне знать, если вам нужна дополнительная помощь, и я могу попытаться помочь.

Смежные вопросы