2012-05-22 3 views
0

У меня есть модель записи, и я хочу создать полевую модель, такую, что данная запись has_many Поля. Аналогично, я хочу, чтобы каждое поле связывалось с тегом таким образом, чтобы каждое поле has_one Tag. Но каждый тег можно многократно использовать между объектами Field.Правильная ассоциация между моделями в рельсах 3

В этом случае я бы просто сказал, что тег belongs_to_many Поля? Точно также было бы правильно сказать, что поле belongs_to_many Records?

(В конце концов, я хочу, чтобы объект Record, чтобы быть контейнером для нескольких полей Я предвижу, имеющий форму, где я могу динамически добавлять новые поля и метки, так что запись может выглядеть следующим образом:.

Record 1 
    Tag 1 
    Field 1 
    Tag 2 
    Field 2 
    ... 

где каждый тег можно либо вытащить из уже существующего пула, либо создать на лету) Спасибо за помощь!

ответ

0

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

+0

Спасибо Бен. Единственное, что меня путает, это ассоциация HABTM, которую вы настраиваете между моделями Record и Field. Я смущен, потому что думал, что запись может иметь много полей, но каждое заданное поле будет принадлежать только одной записи. Другими словами, когда мы говорим об ассоциациях, мы рассматриваем ассоциации с точки зрения одного экземпляра модели или в целом в перспективе класса каждой модели? (Надеюсь это имеет смысл). – oort

+0

Действительно.Если вы хотите, чтобы поле было уникальным для каждой записи, каждое поле принадлежит _ записи, а запись имеет_значные поля. По какой-то причине я думал, что вы хотите, чтобы каждое поле было возможно подключено к различным записям. Изменение этого никак не повлияет на настройку тега, поскольку они все равно могут быть подключены к множеству разных полей, несмотря на то, что эти поля являются уникальными для записи. Надеюсь это поможет. – Ben

Смежные вопросы