Навигация
Взаимосвязи моделей
Теперь база данных знает о взаимосвязях между записями товаров (1 i ne i terns), заказами (orders) и товарами (products). Но Rails-приложение об этом не знает. Нам необходимо добавить к файлам модели некоторые объявления, определяю¬щие характер их взаимосвязей. Откройте в каталоге app/models только что создан¬ный файл order.rb и добавьте к его содержимому объявление has_many.
class Order < ActiveRecord::Base has_many :line_iterns # . . .
end
Указание has_many в какой-то степени говорит само за себя: заказ (order) по¬тенциально может иметь множество связей с записями товаров (line items). Такая привязка к заказу обусловливается тем, что каждая запись товара содержит ссыл¬ку на идентификатор заказа, которому она принадлежит.
Теперь для полноты картины нам нужно добавить указание has_many к моде¬ли товаров (product). Нельзя забывать, что если у нас будет множество заказов, то каждый товар может иметь множество связанных с ним записей товаров.
class Product < ActiveRecord::Base has_many :line_iterns # . ..
Затем мы определим связи, идущие в обратном направлении, от записи товара к таблицам заказов (orders) и товаров (products). Для этого в файле line_item.rb кы дважды воспользуемся указанием belongs_to.
rlass Lineltem < ActiveRecord::Base belongs_to :order belongs_to :product
Указание belongs_to сообщит Rails, что строки таблицы 1 i ne_i terns являют¬ся дочерними строками для строк таблиц orders и products: запись товара не мажет существовать без существования соответствующих строк заказа и товара. Чтобы запомнить, куда следует помещать объявление belongs_to, существует лэвольно простой способ: если таблица имеет внешние ключи, соответствующая модель должна для каждого из них иметь объявление belongs_to.
И какова же роль всех этих объявлений? По сути, они придают объектам мо-жли навигационные возможности. Поскольку мы добавили к Li neltem объявле¬ние belongs_to, мы можем теперь запросить заказ, которому принадлежит дан-шя запись товара, и отобразить имя покупателя:
Lineltem.fi nd(...)
"Этот товар был приобретен #{li.order.name}"
А поскольку в модели заказа Order объявлена возможность отношения к мно¬жеству записей товаров, мы можем на них сослаться (как на коллекцию) из объ-«га заказа order.
sr = Order. f ind(...) prts "Количество товаров в этом заказе: #{order,line_items.size}"
Мы продолжим разговор о взаимосвязях моделей в разделе 18.2, «Определе-связей в моделях».