在代码中使用模型和迁移

时间:2018-07-28 08:21:18

标签: ruby-on-rails postgresql rails-migrations rails-models

我试图解决我试图在Ruby on Rails应用程序中解决的问题,但是经过三天的搜索和尝试,我似乎得到了洞察力并陷入困境:

我有商品和商店,并且许多商店都可以出售商品。该产品的价格在每个商店中可能有所不同,我想创建一个历史记录,以便在每个商店中保存价格信息。

我创建了以下迁移:

class CreateProducts < ActiveRecord::Migration[5.2]
  def change

    create_table :products do |t|
      t.string :name
      t.text :description
      t.string :ean
      t.text :category
      t.belongs_to :shop, index: true
      t.belongs_to :lists, index: true
      t.timestamps
    end

    create_table :shops do |t|
      t.string :name
      t.string :url
      t.integer :priority
      t.timestamps
    end

    create_table :products_shops do |t|
      t.belongs_to :products, index: true
      t.belongs_to :shops, index: true
      t.float :price
      t.timestamps
    end

  end
end

以及以下型号:

class Product < ApplicationRecord
  belongs_to :shops
end

class Shop < ApplicationRecord
  has_many :products
end

我的问题: 如何将价格信息保存到products_shops表中?以及如何与产品一起检索数据,以便获得具有该产品的所有商店的产品信息以及每家商店最近的价格?

1 个答案:

答案 0 :(得分:1)

如果您需要存储价格历史记录以获取最新价格或类似信息,恐怕您当前的products_shops表不会很有用

您可以创建一个单独的Price模型和prices表,其中包含product_idshop_id和实际price。该模型将类似于

class Price < ApplicationRecord
  belongs_to :product
  belongs_to :shop
end

has_many :prices关联添加到productsshops可能很有用:

class Shop < ApplicationRecord
  has_many :products
  has_many :prices
end

class Product < ApplicationRecord
  belongs_to :shops
  has_many :prices
end

然后,您将能够为每对商店和产品节省多个价格,为每种产品获得所有价格,等等

例如,获取特定商店中产品的所有价格(即商店中产品的价格历史记录):

Price.where(product_id: your_product_id, shop_id: your_shop_id)

Price.where(product_id: your_product_id, shop_id: your_shop_id).order(:created_at).last将给出商店中产品的最后价格。