Правильная ассоциация между моделями в 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 через командную строку для быстрой настройки ваших миграций и моделей. Что касается вариантов того, как вы хотите, чтобы ваши ассоциации обрабатывали вещи, когда они удалены, сохранены и т. Д., Просто прочитайте руководство вверху, чтобы найти то, что вы ищете.

Другие вопросы по тегам