Навигация
10.1. Шаг Д1: регистрация заказа
Заказ представляет собой набор записей товаров, дополненный подробностями, необходимыми для оформления покупки. Некоторое подобие записей товаров у нас уже есть. В нашей корзине содержатся отобранные товары, но пока у нас нет для них таблицы базы данных. У нас также нет таблицы для хранения информа¬ции о заказах. После просмотра диаграммы, изображенной на рис. 5.3, и кратких переговоров с заказчиком мы можем приступить к генерации моделей Rails и за¬полнению миграций для создания соответствующих таблиц. Сначала мы создадим две модели.
depot> ruby script/generate model order depot> ruby script/generate model line_item
Затем мы отредактируем два файла миграций, созданные генератором. Снача¬ла заполним ту миграцию, которая предназначена для создания таблицы orders.
Листинг файла db/migrate/005_create_orders.rb cLass CreateOrders < ActiveRecord::Migration
def self.up
create_table :orders do |t| t.column :name, :string t.column :address, :text t.column :email, :string t.column :pay_type, :string,
end
end
:limit => 10
def self.down
drop_table :orders
end
Теперь заполним миграцию для создания таблицы отобранных товаров.
■всгмнг файла depot_p/db/migrate/006_create_line_items.rb class CreateLineltems < ActiveRecord:.Migration
def self.up
create_table :line_items do
t.column :product_id,
t.column :order_id,
t.column :quantity,
t.column :total_price,
end
|t|
:integer, : : integer, : :integer, : :decimal, : :precision
null null
null => false
false false
null => false, => 8, :scale =>
execute "alter table line_items add constraint fk_line_item_products foreign key (product_id) references products(id)" execute "alter table line_items add constraint fk_line_item_orders foreign key (order_id) references orders(id)"
end
def self.down
drop_table :line_items
end
Обратите внимание, что у этой таблицы будут созданы два внешних ключа. Кхжлая строка в таблице line_i terns будет связана как с заказом (order), так и с -аваром (product). К сожалению, миграции Rails не предоставляют способа оп¬ределения ограничений внешних ключей, который был бы независим от типа ба¬яв данных, поэтому мы вынуждены прибегнуть к DDL-операторам (в данном случае к операторам MySQL)1.
" Многие Rails-разработчики не утруждают себя определением ограничений на уровне ба¬зы данных, таких как внешние ключи, полагаясь вместо этого на код приложения, чтобы «беспечить правильную взаимосвязь данных. Возможно, поэтому миграции Rails не позво-' определять ограничения. Тем не менее, когда дело касается вопросов целостности данных, я (Дэйв) думаю, что небольшая дополнительная проверка поможет убе¬речься от частых ночных отладок эксплуатируемых систем. Модуль, автоматически до-ввияющий к моделям ограничения внешнего ключа, можно найти по адресу: http:// *" jedhillconsulting.com.au/rai ls_plugins.html.
Теперь, когда мы завершили создание двух новых миграций, настало время ими воспользоваться.
depot> rake db:migrate
== CreateOrders: migrating =====================================
-- create_table(:orders) -> 0.0066s
== CreateOrders: migrated (0.0096s) ============================
== CreateLi nel.tems : migrating ==================================
-- create_table(:line_iterns) -> 0.0072s
-- executeC'alter table line_items \n add constraint fk_line_... -> 0.0134s
-- executeC'alter table line_items \n add constraint fk_line_... -> 0.0201s
== CreateLineltems: migrated (0.0500s) =========================
огромного количества технической доку¬ментации и преодоления различных трудностей. Все это будет отвлекать нас от изучения Rails, поэтому на данном конкретном вопросе мы останавливаться не будем.
Поскольку база данных пребывала в состоянии своей четвертой версии, за¬пуск команды db:mi grate приведет к выполнению обеих новых миграций. Разу¬меется, мы могли бы применить их и по отдельности, запуская команду после создания каждой миграции.