2012-04-08 2 views
0

Да, еще один вопрос с базой данных с аналогией пиццы. Те, которые я видел, похоже, не нажимают вправо, поэтому здесь идет.Рекомендации по проектированию базы данных в Rails, пицце, топпинге и заказе

Мне нужно иметь возможность заказать несколько пицц с любым количеством начинок в одном заказе. Его основной шаблон корзины покупок, но наполнители затрудняют его реализацию.

Базовые модели,

class Pizza < ActiveRecord::Base 
    has_and_belongs_to_many :orders 
    has_and_belongs_to_many :toppings 
end 

class Topping < ActiveRecord::Base 
    has_and_belongs_to_many :pizzas 
end 

Пицца и Топпинг таблица служат в качестве держателя для информации пиццы и долив типов, которые могут быть заказаны.

class OrdersPizzas < ActiveRecord::Base 
    belongs_to :order 
    belongs_to :pizza 
end 

class PizzasToppings < ActiveRecord::Base 
    belongs_to :topping 
    belongs_to :pizza 
end 

class Order < ActiveRecord::Base 
    has_and_belongs_to_many :pizzas 
end 

[Добавлено]

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

Эта операция выполняется в два этапа: сначала вам нужно создать меню, создав пиццу и начинку, и связав их, не все пиццы могут иметь все начинки.

сыр Пицца может иметь дополнительные оливки, а также дополнительный сыр как начинку

Peperoni Пицца может иметь только дополнительный сыр для начинки

Шаг два фактически размещения заказов в соответствии с введенным данных, таким образом, все многие маны.

Теперь вопрос, после ввода данных выше, я хочу, чтобы оформить заказ

Peperoni Пицца с дополнительным сыром

Cheeze Пицца с дополнительными оливок

в одном порядок, как он должен быть разработан?

Все, что я могу думать о том, чтобы добавить

class OrdersPizzasToppings < ActiveRecord::Base 
    belongs_to :orders_pizzas 
    belongs_to :topping 
end 

так что я могу определить, какая пицца имеет начинку, но это не похоже на правильный путь.

+0

Не работает ли это? –

+0

'Pizza' не может принадлежать более чем 1' Order', не так ли? – Zabba

+0

мой вопрос был поставлен неправильно, уточнили. – Saifis

ответ

0

Хорошо, уже придумали с тем, что работает для меня, объяснения для каждой модели включали над каждым.

Модель Pizza, чтобы создать список пицц, который может быть заказан заказчиками, также связан с заказом, чтобы указать, какая пицца была заказана.

class Pizza < ActiveRecord::Base 
    has_many :pizza_orders 
    has_many :orders, :through => :pizza_orders 
    has_and_belongs_to_many :toppings 
end 

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

class Topping < ActiveRecord::Base 
    has_and_belongs_to_many :pizzas 
    has_and_belongs_to_many :pizza_orders 
end 

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

class PizzasToppings < ActiveRecord::Base 
    belongs_to :pizza 
    belongs_to :topping 
end 

Модель заказа, это просто содержит все таблицы соединения.

class Order < ActiveRecord::Base 
    has_many :pizza_orders 
    has_many :pizzas, :through => :item_orders 
end 

Джойн стола между пиццей и порядком, это многие ко многим это имеет много до конца, и не имеет и относится ко многим, так как в Rails, вы не можете напрямую управлять HBATM объединения таблиц (насколько я пытался), и вам нужно иметь возможность из-за отношения отношения параметров.

class PizzaOrder < ActiveRecord::Base 
    belongs_to :pizza 
    belongs_to :order 

    has_and_belongs_to_many :options 
end 

Таблица соединений, указывающая, какие начинки были выбраны для конкретной пиццы в заказе.

class PizzaOrdersToppings < ActiveRecord::Base 
    belongs_to :pizza_orders 
    belongs_to :topping 
end 

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

+0

просим вас исправить места, где вы использовали item_orders, опции, начинки и пиццу. Не могли бы вы сделать это согласованным. Было бы очень полезно помочь – carbonr

+0

вам удалось создать страницу «Создать заказы». Я изо всех сил могу поделиться этим по http://stackoverflow.com/questions/18641079/how-to-create-nested-form-in-ruby-on-rails/18643327?noredirect = 1 # 18643327 – carbonr

+1

Извините за то, что carbonr, модель модели была от исходного кода, забыли исправить ее в начинки, исправлено сейчас – Saifis

0

Во-первых, я согласен с Zabba - a Pizza должен принадлежать одному Order. Теперь, я думаю, вы можете применить более простое решение. Из того, что я прочитал, и если я не ошибаюсь, вы можете использовать 3 модели.

class Pizza < ActiveRecord::Base 
    belongs_to :order 
    has_many :toppings 
end 

class Order < ActiveRecord::Base 
    has_many :pizzas 
end 

class Topping < ActiveRecord::Base 
    belongs_to :pizza 
end 
+0

Отредактированный вопрос, забыл упомянуть, что ему нужна возможность покупок. – Saifis

+0

Если вам нужны заказы, чтобы получить информацию о начинках, вы всегда можете добавить 'has many: toppings,: through =>: pizza' to' Order' и 'belongs_to: order to' Topping' –

+0

Но не было бы этого endup иметь новый пицца или пополнение в заказе? Где бы вы держали информацию (название ингредиентов, цена и т. Д.) Пиццы и начинки? Он будет работать, если информация о пицце жестко закодирована, но желательно добавить пиццу и начинку. – Saifis

1

Я думаю, что вам нужно присоединиться таблицы представляют собой набор начинок, применяемых к одной пиццы, а также выделить стандартную пиццу, что начинка применяются к:

class Pizza < ActiveRecord::Base 
    belongs_to :order 
    belongs_to :standard_pizza 
    has_one :pizza_topping 
    has_many :toppings, through: :pizza_topping 
end 

class Order < ActiveRecord::Base 
    has_many :pizzas 
end 

class Topping < ActiveRecord::Base 
    has_many :pizza_toppings 
    has_many :pizzas, through: :pizza_toppings 
end 

# A set of toppings applied to one pizza 
class PizzaTopping < ActiveRecord::Base 
    belongs_to :pizza 
    belongs_to :topping 
end 

# Pepperoni pizza, Cheese pizza ... 
class StandardPizza < ActiveRecord::Base 
    has_many :pizzas 
end 
+0

Это и, возможно, соединяя таблицу между стандартной пиццей и доливом, чтобы установить, какая пицца может иметь тупики, она будет работать. Благодарю. Я придумал другой подход, добавив мою версию для ответа. – Saifis

Смежные вопросы