Контекст и история вопроса
У меня есть ресурс с именем Stock
, который представляет акции компании.Эта модель и схема выглядит следующим образом:
# == Schema Information
#
# Table name: stocks
#
# id :bigint(8) not null, primary key
# ticker :string
# name :string
# price :float
# created_at :datetime not null
# updated_at :datetime not null
# jse_link :string
#
class Stock < ApplicationRecord
has_many :port_stocks
validates :ticker, :price, presence: true
end
У меня есть модель User
и модель Portfolio
.Каждый User has_one: portfolio
.
У меня также есть модель PortStock
, которая в основном является экземпляром каждой акции, которую каждый user
имеет в своих portfolio
.то есть, несмотря на то, что система имеет информацию об акциях ABC
(название компании, тикер, цена и т. д.), каждый пользователь будет покупать эти акции по разной цене и покупать разное количество единиц каждой акции, поэтому стоимость позицииу каждого пользователя на складе ABC
будут разные .... отсюда и потребность в новой модели - PortStock
.
При этом каждая Portfolio has_many :port_stocks
.
проблема
Моя основная проблема - попытаться выяснить, как смоделировать покупку и продажу PortStock
, поскольку бизнес-правила отличаются.
Когда пользователь покупает PortStock
, это прямо вперед.Они просто выбирают акцию, которую хотят купить, вводят количество единиц, цену, по которой они хотят ее купить, и т. Д. Затем мы создаем новую запись PortStock
.
.продам PortStock
.Необходимо учитывать следующее:
- В настоящее время пользователь должен владеть
PortStock
. - . Пользователь может продать только максимальное количество
PortStock
единиц, которые онсобственные. - Продажа
PortStock
не означает просто «удаление» ранее bought PortStock
.Он включает в себя создание другой записи. - Эта новая запись
sell
относится к одной (или нескольким) из других buy
записей этой акции.т. е. скажем, пользователю A принадлежит 1000 единиц ABC
, и он хочет продать 500 единиц ABC
, 500 единиц еще осталось (то есть исходные 1000 должны быть изменены, чтобы быть 500).
Так что мне трудно моделировать это и получать правильные контроллеры.
Вот как выглядит моя PortStock
модель:
# == Schema Information
#
# Table name: port_stocks
#
# id :bigint(8) not null, primary key
# portfolio_id :integer
# stock_id :integer
# volume :integer
# purchase_price :float
# current_price :float
# percent_change :float
# created_at :datetime not null
# updated_at :datetime not null
# current_value :float
# dollar_change :float
# total_spend :float
# bought_on :datetime
# action :integer
# position :integer default("open")
#
class PortStock < ApplicationRecord
belongs_to :portfolio
belongs_to :stock
enum action: [ :buy, :sell ]
enum position: [ :open, :closed ]
end
В попытке упорядочить все,Я пытался не просто выполнять действия PortStock#Sell
и PortStock#Buy
в своем контроллере PortStock
, поэтому я пытался поместить все в app/controllers/port_stocks/
, например, app/controllers/port_stocks/buy_controller.rb
и app/controllers/port_stocks/sell_controller.rb
.
в каждом, Я создал файлы _form.html.erb
, new.html.erb
и create.html.erb
, чтобы использовать REST.
Итак, на своих маршрутах я сделал это:
resources :port_stocks do
scope module: 'port_stocks' do
resources :buy
resources :sell
end
end
Это генерирует следующее new
route:
new_port_stock_buy_path GET /port_stocks/:port_stock_id/buy/new(.:format) port_stocks/buy#new
Обратите внимание на :port_stock_id
в URL.
Но это пока не работает должным образом для меня.В моей голове все кажется очень запутанным, и я не чувствую, что все сделано правильно.