2016-11-29 5 views
0

Я довольно новичок в рельсах, и у меня проблемы с некоторыми отношениями Model.Отношения модели

У меня есть эти таблицы

+--------------+-----------------+------+ 
| Artists  | Artist Features | Tags | 
+--------------+-----------------+------+ 
| ID   | ID    | ID | 
| Name   | artist_id  | name | 
| Address  | price   |  | 
| Country  | tag_id   |  | 
| Email  |     |  | 
+--------------+-----------------+------+ 

У меня есть отношения между художниками и художника Особенности artistshas_manyartist_features и artist_featureshas_many теги. Я хочу с запросом получить все художник, функцию и меток на основе приведенных выше структуру, artist_id и tag_id

Я использовал ниже, чтобы получить artists и соответствующий artist_features, но хотели бы также получить тег тоже на основе tag_id

@Artists = Artist.all.artist_features 
+1

Если у исполнителя есть теги 'has_many', то вы должны иметь столбец' artist_feature_id' таблицы 'tags', а не столбец' tag_id' таблицы 'artist_features'. –

ответ

1

If это функция художника has_many тегов, то вам необходимо изменить столбцы таблицы, чтобы соответствовать этой структуре отношений.

A has_many/belongs_to Отношения всегда требуют, чтобы модель с вызовом метода belongs_to имела столбец внешнего ключа.

В этом случае вы хотите иметь набор тегов и позволить функциям исполнителя ссылаться на эти теги. Мы можем сделать это, добавив еще одну модель между ArtistFeature и Tag, называемую ArtistFeatureTag, с таблицей artist_feature_tags.

Ваша модель структуры, то будет выглядеть следующим образом:

Исполнитель: id, name, address, country, email

class Artist 
    has_many :artist_features 
end 

Исполнитель Характеристика: id, artist_id, price

class ArtistFeature 
    belongs_to :artist 
    has_many :artist_feature_tags 
    has_many :tags, through: :artist_feature_tags 
end 

Арканзас tistFeatureTag: id, artist_feature_id, tag_id

class ArtistFeatureTag 
    belongs_to :artist_feature 
    belongs_to :tag 
end 

Тэг: id, artist_feature_id, name

class Tag 
    has_many :artist_feature_tags 
    has_many :artist_features, through: :artist_feature_tags 
end 

Дополнительный стол может показаться неинтуитивным, но это необходимо, чтобы сохранить взаимосвязь между функциями художника и тегами, т.е. несколько функции исполнителя могут ссылаться на один и тот же тег, и эти ссылки принимают форму ArtistFeatureTag s.

Обратите внимание, что это в основном has and belongs to many-type relationship, но я решил явно создать модель для отношений, поскольку я думаю, что это делает вещи более ясными.

+0

Спасибо Крис, Моя таблица тегов Я не хочу дублировать строки с тем же именем тега. Итак, если в этом теге не будет работать artist_feature_id на моем теге? Возможно, моя структура не очень ясна! – Adam

+0

Понятно, тогда я уточню свой ответ. –

+0

Спасибо, Крис, очень ценим! это то, что мне нужно. – Adam

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