Вы знаете, что когда требуется организовать many-to-many отношения между двумя моделями, прогрессивная часть человечества применяет join-таблицы и метод
has_many
с опцией
:through => :join_model_name
. Каждая связь между двумя ActiveRecord-объектами представляет собой ActiveRecord-объект.
И это чудесно, ибо в join-таблице можно насоздавать полезных (так называемых «extra») полей с дополнительной информацией о связях между объектами.
Вопрос в том, как красиво достучаться до этих extra атрибутов.
Все скринкасты и книжки, как назло, оперируют простыми примерами. Например, дружат между собой модели
Article и
Category. Само собой, для join-класса интуитивно напрашивается имя
Categorization или
ArticleCategorization.
Соответственно, если у нас есть два объекта —
article и
category, и мы хотим найти AR-объект (или объекты), олицетворяющий связь между ними, то авторы книжек с чистым сердцем предлагают делать так:
relations = article.article_categorizations.find_by_category_id(category)
В жизни все сложнее. Модели нередко имеют длинные составные имена, либо между моделями такая связь, что придумывание имени для каждой join-модели превращается в маленькую пытку. Представим, что у нас модели не
Article и
Category, а
UserGroup и
Community, или
Preorder и
CustomerNotification. Как должна называться связующая модель? Возможны варианты.