Как организовать свои контроллеры в каталогах, но при этом получить преимущества REST? - PullRequest
0 голосов
/ 10 июня 2018

Контекст и история вопроса

У меня есть ресурс с именем 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.Необходимо учитывать следующее:

  1. В настоящее время пользователь должен владеть PortStock.
  2. . Пользователь может продать только максимальное количество PortStock единиц, которые онсобственные.
  3. Продажа PortStock не означает просто «удаление» ранее bought PortStock.Он включает в себя создание другой записи.
  4. Эта новая запись 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.

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

1 Ответ

0 голосов
/ 10 июня 2018

Не похоже, что вы используете ресурс stocks для чего-то большего, чем пространство имен, поэтому я бы предложил сделать именно это:

namespace :stocks do
  resources :buy
  resources :sell
end

В попытке остаться RESTful, я нене любите свои ресурсы buy или sell, поскольку они являются глаголами, а не существительными (ресурсы - это существительные; тогда у вас есть действия или глаголы RESTful).возможно :buy_order.Какую модель они составляют?Может быть, стоит немного подумать, прежде чем увековечить память этих контроллеров.

...