понедельник, 22 июня 2009 г.

Связи в моделях. Один ко многим

В предыдущей статье обсуждалась проблема связывания 2 моделей, как "1 к 1". Наша сегодняшняя тема - как связать модели один ко многим.

На самом деле, все не сложнее чем связь 1 к 1, потому чтобы не вдаваться в детали, сразу приведу пример:

class Order < ActiveRecord::Base
   belongs_to :user
end

class User < ActiveRecord::Base
   has_many :orders
end

Здесь описываем связь, когда каждый пользователь может иметь несколько заказов.

Как и в предыдущем примере, связь belongs_to в модели Order показывает что каждый ее экземпляр, может относится только к одному экземпляру модели пользователей (User).

В модели User есть новое для нас условие связи has_many :orders , которое, буквально дословно, означает, что каждый экземпляр класса (модели) User - имеет несколько экземпляров класса (модели) Order.

Вот впринципе и все описание. Теперь осталось рассмотреть несколько примеров использования :

Пример только в целях демонстрации, не используйте его для подсчета суммы:
user = User.find(id)
total = 0;
user.orders.each do |order|
   total += order.price
end

Правильно посчитать сумму можно так:
total = user.orders.sum(:price)

Мы легко можем оперировать свойством orders в цикле, где множественное число имени свойства показывает нам, что мы имеем дело с коллекцией экземпляров order, для конкретного экземпляра user.

Рассмотрим еще один пример, который продемонстрирует, как можно добавлять новые заказы пользователю, а также то, как их при этом создавать даже "на лету":

new_order = Order.create(:price => 150.00)
user.orders << new_order

или еще проще:

user.orders << Order.create(:price => 100.00)

Где "<<" - операция добавления нового значения в массив (коллекцию)

На первый взгляд может показаться, что Рельса не очень гибкая и довольно громоздкая. Но на самом деле все не так - после того, как я опишу все связи моделей, я посвящу несколько статей нестандартным способам описания связей.

Основной принцип рельсы - минимальными усилиями, за минимальное количество времени, создать рабочее приложение. Потому все стандартные операции упрощены до предела, но с другой стороны - существуют очень мощные и гибкие механизмы для решения нестандартных задач. Профессионализм разработчика на рельсе, как раз и заключается в правильном понимании, а также грамотном использовании таких механизмов.

Комментариев нет:

Отправить комментарий