【问题标题】:Rail: two models for one table导轨:一张桌子两种型号
【发布时间】:2017-10-31 04:33:56
【问题描述】:

当用户购买产品时,它会进入他的库存。所以只能销售库存产品。 Stock 表有一个 product_id 列。简单来说,当用户在 products/product_id 页面上时,订单必须是买入,而在股票/stock_id 页面上时,订单必须是卖出。

我只想使用一个表 Order,而不是创建两个表 buy_order 和 sell_order。

所以我创建了没有迁移的buy_order和sell_order模型,显然它继承自Order模型,以及控制器sell_orders和buy_orders。

我只是想知道这是否是只使用一张桌子的正确方法。

我的模特:

class Order < ApplicationRecord
    belongs_to :product
end

class BuyOrder < Order
end

class SellOrder < Order
end

class Product < ApplicationRecord
    has_many :buy_orders
    has_many :sell_orders
    has_many :stocks
end

class Stock < ApplicationRecord
    belongs_to :product
end

我的控制器

class BuyOrdersController < ApplicationController

    def create
       ...
       order.type = 'buy'
       ...
    end
end

class SellOrdersController < ApplicationController

    def create
       ...
       order.type = 'sell'
       ...
    end
end

Routes.rb:

resources :products, only: [:index, :show] do
  resources :buy_orders, only: [:create]
end

resources :stocks, only: [:index, :show] do
  resources :sell_orders, only: [:create]
end

耙子路线:

products_orders POST       /products/:product_id/buy_orders(.:format) orders#create
products_index GET        /products(.:format) products#index
product GET        /products/:id(.:format) products#show
stocks_orders POST       /stocks/:stock_id/sell_orders(.:format) orders#create
stocks_index GET        /stocks(.:format) stocks#index
stock GET        /stock/:id(.:format) stocks#show

【问题讨论】:

  • 解决这个问题的方法是使用 1 个带有 side 列的表,例如,您可以在其中保存订单方(即“卖出”/“买入”)
  • @uzaif 你觉得这里需要继承吗?
  • 这称为单表继承 (STI),它是一种常见模式。如果买/卖订单的属性集相同(是吗?),不确定这里是否有保证。无论如何,谷歌这个。

标签: ruby-on-rails ruby database model-view-controller


【解决方案1】:

我看不出将您的“订单”模型分成两个不同的模型的用途。就个人而言,我选择简单。在您的订单表中有一个属性side,它将是sellbuy。一个product 将有许多orders,每个都属于一个product

class Product < ApplicationRecord
    has_many :orders
    has_many :stocks
end

然后你可以很容易地参考像这样的一面:

Product.first.orders.where(side: 'sell')

将为第一条产品记录检索所有sell 订单。

【讨论】:

  • 这没有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多