Rails: структура управления приложениями с вложенными ресурсами - PullRequest
0 голосов
/ 11 июля 2010

Я новичок в rails и работаю над внутренним приложением для управления контентом.Я сделал прототип, но чувствую, что он грязный и есть лучший способ.Мне требуется следующее:

В моем текущем прототипе используется рабочий процесс (http://github.com/geekq/workflow) плагин для управления состоянием как проекта, так и тем. Я также посмотрел на activ_as_tree и acts_as_list, но не уверен, как лучшеструктурировать вещи.

========

Проект (имеет заголовок, описание, крайний срок, workflow_state) [состояния: неопубликовано (например, черновик), опубликовано (темы можно проверитьвход и выход и т. д.), в архиве (состояние завершено)]

Модуль (является дочерним элементом проекта [действует как группа]; может быть много; имеет заголовок, описание, содержимое)

Раздел (является потомком модуля [действует как группа]; может быть много; необязательно; имеет заголовок, описание, содержимое)

Тема (является потомком раздела; может быть много; может быть упорядочен; имеет заголовок, описание, содержимое, workflow_state, owner_id, order) [состояния: новые, check_out, pending_review, review_required, завершено]

Процесс (является дочерним по отношению к теме; может быть много; необязательно; имеет заголовок, описание, содержимое)

Ресурсce (является потомком процесса;может быть много;необязательный;файл;имеет заголовок, resource_link)

-

(Есть также еще 2 объекта, которые связаны с проектом; введение и основные принципы. Для каждого проекта будет только один объект)

Введение (является дочерним элементом проекта; только один; имеет: title, description, content, workflow_state) [указывает: то же самое по теме]

Основы (является дочерним по отношению к проекту; только один; имеет:title, description, content, workflow_state) [сообщает: это же тема]

NB.Мне известно, что некоторые из этих слов зарезервированы и должны быть псевдонимами.

========

Я надеюсь использовать структуру URL, аналогичную следующей:

/ projects /: project_id / modules /: module_id / themes /: section_id / themes /: topic_id / projects /: process_id / resources /: resource_id

или (если раздел пропущен)

/ projects /: project_id / modules /: module_id / themes /: topic_id / projects /: process_id / resources /: resource_id

======= *

Любойответы приветствуются.

ОБНОВЛЕНИЕ: Rails 2.3.8

1 Ответ

1 голос
/ 11 июля 2010

Вы не сказали, какую версию Rails вы используете.Я предполагаю версию 2 для этой цели.В вашем config/routes.rb вы можете установить иерархические отношения, например:

ActionController::Routing::Routes.draw do |map|
  map.resources :projects do |projects|
    projects.resources :modules do |modules|
      modules.resources :topics do |topics|
        topics.resources :processes do |processes|
          processes.resources :resources
        end 
      end
    end
  end
end

Маршрутизатор Rails 3 имеет аналогичную возможность.

ОБНОВЛЕНИЕ: решение дополнительных вопросов в комментариях ниже

Правила ассоциаций для этого приложения несколько отражают вышеприведенную иерархию маршрутизации.Один из способов подумать о них - посмотреть URL-адреса ресурсов, которые вы предложили в своих вопросах.Чтение слева направо по URL дает вам отношение has_many.Чтение справа налево дает вам отношение belongs_to.Например:

class Project < ActiveRecord::Base
  has_many :modules
end

class Module < ActiveRecord::Base
  belongs_to :project
  has_many   :topics
end

class Topic < ActiveRecord::Base
  belongs_to :module
  has_many   :processes
end

Вы можете получить доступ к дочерним элементам, например:

@project.modules
@module.topics
@topic.processes

и т. Д.

Вопрос о дополнительном разделе требует, чтобы вы думали о маршрутизации иСхема представления и ассоциации.Первый самый простой.Второе - это то, с чем вам следует быть осторожным, чтобы не слишком сильно ненормировать ваше моделирование.Правила маршрутизации могут быть изменены следующим образом:

ActionController::Routing::Routes.draw do |map|
  map.resources :projects do |projects|
    projects.resources :modules do |modules|
      modules.resources :sections do |sections|
        sections.resources :topics do |topics|
          topics.resources :processes do |processes|
            processes.resources :resources
          end
        end 
      end
      modules.resources :topics do |topics|
        topics.resources :processes do |processes|
          processes.resources :resources
        end 
      end
    end
  end
end
...