Я хотел бы проиллюстрировать, как три термина реализованы в Rails. ActiveRecord называет любой тип отношений между двумя моделями association
. Не часто можно найти термины composition
и aggregation
при чтении документации или статей, связанных с ActiveRecord. Ассоциация создается путем добавления одного из макросов класса ассоциации в тело класса. Вот некоторые из этих макросов: belongs_to
, has_one
, has_many
и т. Д.
Если мы хотим установить composition
или aggregation
, нам нужно добавить belongs_to
к собственной модели (также называемой дочерней) и has_one
или has_many
к модели-владельцу (также называемой родительской). ). Настроены ли мы composition
или aggregation
, зависит от параметров, которые мы передаем вызову belongs_to
в дочерней модели. До Rails 5, при настройке belongs_to
без каких-либо параметров создавался aggregation
, дочерний элемент мог существовать без родительского элемента. Если мы хотели composition
, нам нужно было явно объявить это, добавив параметр required: true
:
class Room < ActiveRecord::Base
belongs_to :house, required: true
end
В Rails 5 это было изменено. Теперь, если объявить ассоциацию belongs_to
, по умолчанию создается composition
, дочерний элемент не может существовать без родителя. Таким образом, приведенный выше пример можно переписать так:
class Room < ApplicationRecord
belongs_to :house
end
Если мы хотим позволить дочернему объекту существовать без родителя, нам нужно объявить это явно с помощью опции optional
class Product < ApplicationRecord
belongs_to :category, optional: true
end