Предметы - Заказы Присоединиться к столу, трудно понять код приложения ресторана - PullRequest
0 голосов
/ 28 августа 2018

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

ActiveRecord::Schema.define(version: 20160327212111) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "items", force: :cascade do |t|
    t.string  "name"
    t.string  "cuisine_type"
    t.integer "price"
  end

  create_table "items_orders", id: false, force: :cascade do |t|
    t.integer "order_id", null: false
    t.integer "item_id",  null: false
  end

  add_index "items_orders", ["item_id", "order_id"], name: "index_items_orders_on_item_id_and_order_id", using: :btree
  add_index "items_orders", ["order_id", "item_id"], name: "index_items_orders_on_order_id_and_item_id", using: :btree

  create_table "orders", force: :cascade do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "party_id"
    t.boolean  "paid?",      default: false
  end
    end

А вот и метод создания заказа контроллера, который смущает меня еще больше.

  def create
    food_items = params[:item][:item_id].drop(1).map{ |item| item.to_i}
    @items = Item.where("id in (?)", food_items)
    @order = Order.new(order_params)
      # items_array = params[:item]["item_id"].drop(1)

    if @order.save
        @items.each { |item| @order.items << item }
        redirect_to orders_path
    else
      redirect_to new_order_path
    end
  end

Спасибо за вашу помощь.

ОБНОВЛЕНИЕ моделей товара и заказа

    class Item < ActiveRecord::Base
  has_and_belongs_to_many :orders
end

    class Order < ActiveRecord::Base
  has_and_belongs_to_many :items
  has_one :party

end

Контроллер товаров и заказов

    class ItemsController < ApplicationController

  def index
    @item = Item.all
  end

  def show
    @item = Item.find(params[:id])
  end

  def new
    @item = Item.new
  end

  def create
    @item = Item.new(item_params)
    if @item.save
    redirect_to items_path
    else
    redirect_to new_item_path
  end

  end

  def edit
    @item = Item.find(params[:id])
  end

  def update
    @item = Item.find(params[:id])
    @item.update(item_params)
    redirect_to items_path
  end

  def destroy
    @item = Item.find(params[:id])
    @item.destroy
    redirect_to items_path
  end

  private

  def item_params
    params.require(:item).permit(:name, :cuisine_type, :price)
  end


end

    class OrdersController < ApplicationController

  def index
    @orders = Order.order(:party_id)
    @items = Item.all
    @parties = Party.all
  end

  def show
    @orders = Order.find(params[:id])
  end

  def new
    @order = Order.new
    @orders = Order.all
    @items = Item.all
    @parties = Party.all
  end

  def create
    puts "Item ids #{params[:item][:item_id]}"
    food_items = params[:item][:item_id].drop(1).map{ |item| item.to_i}
    @items = Item.where("id in (?)", food_items)
    @order = Order.new(order_params)
      # items_array = params[:item]["item_id"].drop(1)
    if @order.save
        @items.each { |item|
          @order.items << item
        }
        redirect_to orders_path
    else
      redirect_to new_order_path
    end
  end

  def destroy
    @order = Order.find(params[:id])
    @order.destroy
    redirect_to orders_path
  end


  private
  def order_params
    params.require(:order).permit(:party_id, :item_id)
  end

end

1 Ответ

0 голосов
/ 28 августа 2018

Согласно вашей схеме, у вас должна быть связь "имеет-и-принадлежит-ко-многим" между Order и Item классами.

Отказ от ответственности: Это может быть легко-101-* связь вместо HABTM, но я не вижу никаких дополнительных столбцов в таблице соединений items_orders . Также вы не упомянули какое-либо специальное использование модели ItemsOrder (если она существует). Итак, я пойду с более простым, HABTM.

Модели:

class Order
  has_and_belongs_to_many :items
end

class Item
  has_and_belongs_to_many :orders
end

С этими ассоциациями вы можете выполнять следующие операции:

# Say, you have some items in your database
item = Item.take
 => #<Item id: 1>

Order.count
 => 0

# Create a new order and assign `item` to it
order = Order.new
order.items << item
order.save!

Приведенный выше набор операторов вставит новую запись в таблицу соединений следующим образом:

| id | order_id | item_id |
| 1  | 1        | 1       |

Теперь вы можете проверить элементы в заказе как:

order.items
 => [#<Item id: 1>, ...]

или обратное:

item.orders
 => [#<Order id: 1>, ...]

Теперь давайте пройдемся по коду контроллера:

def create
  # I don't know what `params[:item][:item_id]` contains, but `drop` method drops the first n (in this case, 1) number of elements and returns the remaining array
  # ... and map is changing each element from whatever format to integer format
  # Read more:
  #   - https://apidock.com/ruby/Array/drop
  #   - https://apidock.com/ruby/Array/map
  food_items = params[:item][:item_id].drop(1).map { |item| item.to_i }

  # Searching for items with ID ANY IN given array of IDs
  @items = Item.where("id in (?)", food_items)

  # Initialize a new order with permitted params (hopefully). Check definition of `order_params `
  @order = Order.new(order_params)

  if @order.save
    # Assigning each searched item to new order, which will create as many new records in join table as the number of `@items`
    @items.each { |item| @order.items << item }

    # The usual
    redirect_to orders_path
  else
    # Shouldn't it be render, and not redirect
    redirect_to new_order_path
  end
end

Надеюсь, это поможет.

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