Структурирование ассоциации Rails

Как мне структурировать эту ассоциацию Rails?

Проблема

Таким образом, в основном пользователь может создать набор данных, а затем построить на его основе графики. Я хочу, чтобы пользователь мог создать проект и пометить наборы данных или графики несколькими проектами. Если набор данных помечен проектом, он не должен автоматически помечать все принадлежащие ему графики (набор данных).

Я немного новичок в ассоциации Rails. Читая документы, кажется, что я мог бы сделать что-то подобное.

  1. "набор данных" has_many "графики".
  2. "проект" имеет_много "наборов данных" и "графиков".
  3. "набор данных" has_many "проектов".
  4. "график" has_many "проектов".

Решение: (это правильно?)

4 модели: Dataset, Graph, Project, ProjectContent

Для №1:

Dataset has_many Graphs
Graph belongs_to Dataset

Для № 2:

Project has_many datasets, through: :project_content
Project has_many graphs, through: :project_content

Для № 3:

Dataset has_many projects, through: project_content

Для № 4:

Graph has_many projects, through: project_content

comment
Не могли бы вы уточнить: если у вас есть проект, можете ли вы пометить графики для него, даже если вы не пометили связанный набор данных? Например: в наборе данных1 есть график1, в наборе данных2 есть график2. project1 пометил набор данных1 и график2.   -  person Ninigi    schedule 26.01.2014
comment
да, именно @Chai :) каждый элемент назначается проекту по одному.   -  person Don P    schedule 26.01.2014


Ответы (1)


Это кричит мне «Полиморфный», в значительной степени вариант использования по умолчанию;)

Модель тега:

belongs_to :taggable, :polymorphic => true
belongs_to :project

Модель проекта:

has_many :tags
has_many :datasets, :through => :tags, :source => :taggable, :source_type => 'Dataset'
has_many :graphs, :through => :tags, :source => :taggable, :source_type => 'Graph'

Графическая модель:

belongs_to :dataset
has_many :tags, :dependent => :destroy
has_many :projects, :as => :taggable

Модель набора данных:

has_many :graphs
has_many :tags, :dependent => :destroy
has_many :projects, :as => :taggable

Если вы НЕ хотите использовать полиморфную модель, ваш подход кажется правильным.

person Ninigi    schedule 25.01.2014
comment
Спасибо, Чай, не уверен, что вижу, что полиморфный дает мне по сравнению с моей текущей моделью. - person Don P; 26.01.2014
comment
Только с двумя тегируемыми типами: ничего :) Может быть, однажды в проекте будет много разных тегов... XD - person Ninigi; 26.01.2014