2016-06-11 5 views
0
  1. Пользователь может научить много тем, и каждая тема может иметь много уроков.
  2. Пользователь может присоединиться к урокам, созданным другими пользователями.

(1) довольно просто и я реализовал это следующим образом:Rails - множественные отношения между моделями

#user.rb 
has_many :topics 
has_many :lessons, through: :topic 

#topic.rb 
has_many :lessons 

#lesson.rb 
belongs_to :topic 
belongs_to :user 

(2) является много-ко-многим, и я думаю, что присоединиться к таблице - давайте назовем это соответствует (за дополнительную плату указывает, чтобы помочь мне найти лучшее имя!) - требуется.

Если добавить следующее

#user.rb 
. 
. 
has_many :lessons, through: :match 

#lesson.rb 
. 
. 
has_many :users, through: :match 

#match.rb 
belongs_to :lesson 
belongs_to :user 

Я думаю, что я получаю сообщение об ошибке, поскольку Rails не может получить разницу между двумя отношениями при вызове @ user.lessons, например.

Какой может быть правильный подход?

p.s. Я вижу, что есть много вопросов, подобных этому, но я не смог найти правильное решение моей проблемы.

ответ

0

Я думаю, что вы должны назвать таблицу соединений user_lessons, а не соответствовать тому, что принято в Rails для таблиц объединения. После переименования, я думаю, вы скорее должны иметь это так:

user.rb

has_many :user_lessons 
    has_many :subscribed_lessons, through: :user_lessons, source: :lesson 

Также обратите внимание, что ваш пользователь

has_many :lessons, through: :topics #not :topic 

Позвольте мне знать, если это работает.

+0

спасибо oreoluwa, ваш ответ имеет большой смысл. Я проверю это и дам вам знать, но я думаю, что это правильный путь. Спасибо за подсказку по именованию, я последую вашим советам. Недостающие 's' на темы были опечатками, но спасибо за указание на это :) Если тогда мне нужно что-то вроде lesson.subscribed_users, чтобы увидеть список подписчиков, я думаю, я добавлю 'has_many: signeded_users, через: user_lessons, source :: users' to lesson.rb, правильно? – davideghz

+0

Думаю, да. Обратите внимание, что ваш источник должен быть 'user' not' users' – oreoluwa

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