0

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

Каковы были бы лучшие методы моделирования AR-отношений с комбинацией однонаправленного наследования и полиморфных ассоциаций в Rails 3.2? Решив использовать оба варианта, будут ли какие-либо важные недостатки этого приложения? Изменили бы Rails 4?

У меня есть следующие модели до сих пор:

class Course 
     has_many :participants, class_name: 'User' 
     has_many :events, as: :eventable 
    end 

    class User 
     has_many :events, as: :eventable 
     has_many :courses 
    end 

    class Resource 
     has_many :events, as: :eventable 
    end 

    class Subject < Resource 
    end 

    class Location < Resource 
    end 

    class Medium < Resource 
    end 

    class Event 
     belongs_to :eventable, polymorphic: true 
    end 

выглядит относительно легко до сих пор, но я борюсь со сложными ассоциациями. Как настроить следующие ассоциации с STI?

  • курс может иметь много ресурсов (как предметы/места)
  • пользователь может иметь много ресурсов (как предметы/место)
  • ресурс может иметь множество пользователей (как контакты)
  • в событие само по себе может иметь дополнительные пользователи (как учителей)
  • событие само по себе может иметь дополнительные ресурсы (как локаций/предметы/Medias)

Примеры для что я хотел бы извлечь из базы данных

  • все события для пользователя
  • все события для курса
  • все многоборье (пользователей и курс) для участника
  • все связанные с ним ресурсы типа место от случая
  • всех связанных с ним учителями от случая
  • всех ресурсов типа местоположения от курса
  • всех ресурсов станда е субъект от пользователя

ТИА и наилучшими пожеланиями

Chris

+0

Я новый пользователь Stackoverflow (но читаю сайт в течение многих лет). Я разочарован тем, что мои первые вопросы отмечены как закрытые. – Chris

+0

Я попытался быть кратким и сделать его общим вопросом относительно ИППП и полиморфных ассоциаций. Чтобы понять проблему, я должен был привести конкретный пример. Я бы подумал, что мой вопрос и первый ответ могут помочь другим людям, которые пытаются отменить связь между ИППП и полиморфными отношениями в Rails. – Chris

+0

Крис, я считаю, что ваш вопрос слишком широк. Было бы лучше, например, показать код, который у вас уже есть, и спросить, как настроить определенную конкретную ассоциацию. Что вы уже пробовали? Ваш вопрос, скорее всего, потребует общих ответов на подходы, которые затем могут генерировать обсуждения и т. Д. Что сделает SO более форума, чем сайт Q & A. – Peter

ответ

1

Вы могли бы использовать те, и еще некоторые магии Rails' :)

class Course 
    has_many :participants, class_name: 'User' 
    has_many :subjects, conditions: ['type = ?', 'Subject'] 
    has_many :locations, conditions: ['type = ?', 'Location'] 
    has_many :events, as: :eventable 
end 

class User 
    has_many :subjects, conditions: ['type = ?', 'Subject'] 
    has_many :locations, conditions: ['type = ?', 'Location'] 
    has_many :events, as: :eventable 

    belongs_to :event, foreign_key: :teacher_id 
end 

class Resource 
    has_many :contacts, class_name: 'User' 
    has_many :events, as: :eventable 
end 

class Event 
    belongs_to :eventable, polymorphic: true 
    has_many :teachers, class_name: 'User' 

    has_many :subjects, conditions: ['type = ?', 'Subject'] 
    has_many :locations, conditions: ['type = ?', 'Location'] 
    has_many :media, conditions: ['type = ?', 'Medium'] 
end 

Я думаю, что это охватывает все ваших вариантов использования.

примечание: вероятно, вы должны переименовать свою модель с Media в Medium, так как Rails лучше работает с именами уникальных моделей, и если вы этого не сделаете, вы можете столкнуться с некоторыми проблемами.

+0

Отличный ответ, большое спасибо. Я хотел бы отредактировать ваш ответ, чтобы завершить его: показать пустые подклассы ресурсов и показать, что «у пользователя много курсов». – Chris