Правильная ассоциация между моделями в Rails 3
У меня есть модель записи, и я хочу создать модель поля так, чтобы данная запись has_many
Поля. Точно так же я хочу, чтобы каждое поле было связано с тегом, чтобы каждое поле has_one
Тег. Но каждый тег можно многократно использовать между объектами поля.
В этом случае я бы просто сказал, что тег belongs_to_many
Поля? Точно так же было бы правильно сказать, что поле belongs_to_many
Записи?
(В конечном итоге я хочу, чтобы объект Record был контейнером для нескольких полей. Я предполагаю наличие формы, в которой я мог бы динамически добавлять новые Field и Tag, чтобы запись могла выглядеть следующим образом:
Record 1
Tag 1
Field 1
Tag 2
Field 2
...
где каждый тег может быть извлечен из существующего пула или создан на лету) Спасибо за помощь!
1 ответ
Во-первых, я настоятельно рекомендую прочитать Руководство по ассоциациям RoR: http://guides.rubyonrails.org/association_basics.html
Прочитайте это руководство, если вы новичок или вам нужно подправить использование ассоциаций в RoR.
Ваш вопрос выглядит скорее логичным, но я начну с кода для него:
class Record < ActiveRecord::Base
has_and_belongs_to_many :fields
...
class Field < ActiveRecord:Base
has_and_belongs_to_many :records
belongs_to :tag
...
class Tag < ActiveRecord:Base
has_many :fields
...
Каждая запись подключается ко многим различным полям, а каждое поле подключается ко многим различным записям. Это классический пример ассоциации многих со многими. Логика в вашем коде, когда вы на самом деле используете эти модели, делает модель записи похожей на контейнер (поскольку технически можно сказать, что поле является контейнером для многих записей).
С каждым полем будет связан 1 тег, но этот же тег можно использовать с любым количеством полей (можно сказать, что поля повторно используют теги). Это ассоциация один ко многим. При создании этого соединения вы будете использовать own_to в модели Field и has_many в модели Tag.
Поскольку тег связан с моделью поля, логика, которую вы ищете: запись - это контейнер для полей и тегов, имеет смысл с этой настройкой.
Вот простой пример получения тега внутри записи:
#Returns the Tag Associated with the first field
#"inside" the first Record in the database.
Record.first.fields.first.tag
Точно так же можно легко пойти в противоположном направлении:
Tag.first.fields.first.records.first
Обязательно используйте команды Rails через командную строку для быстрой настройки ваших миграций и моделей. Что касается вариантов того, как вы хотите, чтобы ваши ассоциации обрабатывали вещи, когда они удалены, сохранены и т. Д., Просто прочитайте руководство вверху, чтобы найти то, что вы ищете.