管理与多个级别链接的多个分层Rails模型

时间:2016-09-13 11:58:01

标签: ruby-on-rails ruby-on-rails-4 database-design rails-activerecord

我正在构建一个待办事项应用程序,但具有多个级别的任务和子任务。我一直在关注Michael Hartl的Ruby on Rails Tutorial,我到目前为止所学到的几乎所有东西都是从那里开始的。

我的应用有多个层次结构模型。我的意思是,在顶部是用户,用户可以有多个目标,每个目标可以有多个任务,每个任务可以有多个子任务。

为了给你一个更明确的想法,我将列出层次结构

  • 用户
  • 目标(每个用户多个目标)
  • 任务(每个目标有多个任务)
  • 子任务(每个任务多个子任务)

现在,当我创建模型时,我在目标和用户之间包含了一个依赖项(has_many / belongs_to),但我也为任务和用户以及子任务和用户做了同样的事情。这样做的原因是我想在所有与用户表对应的表中都有一个'id'列,以便我可以非常轻松地列出用户的所有子任务/任务/目标。

来到前端,我需要能够添加目标/任务/子任务的表单。

用户和目标之间的关系根本不存在问题。 has_many / belongs_to关系允许我使用类似

的用户
 def create
  @goal = current_user.goals.build(path_params)

   if @goal.save
     redirect_to current_user
   else
    .
    .
   end

 end

但是,当我有3级层次结构时会出现问题。用户,目标和任务。

我的问题是我如何为任务控制器做到这一点?

我尝试使用像

这样的东西
@task = current_user.goals.tasks.build(task_params)

但除了可能在语法上不正确之外,它有明显的缺陷:无法检测此任务分配给哪个特定目标。

我能想到的是前端表单必须包含一个字段(可能是隐藏的),其中包含要为其分配任务的目标ID。但不完全确定这是否也是正确的,或者如果像这样的前端噱头如果能有更多级别的层次结构实际上有所帮助。

请告诉我哪里出错了/最好的办法是什么。

我现在只是一个初学者,所以我对如何管理多级模型层次结构非常困惑。

1 个答案:

答案 0 :(得分:0)

  

我能想到的是前端表单必须包含一个字段(可能是隐藏的),其中包含要为其分配任务的目标ID。

或多或少。更好的方法是在这里拥有RESTful资源。所以你将拥有这种嵌套资源的结构:

# routes.rb

resources :users

resources :goals do
  resources :tasks do
    resources :subtasks
  end
end

这意味着要创建任务,您必须向

发送POST请求
/goals/1/tasks

这样,在您的TasksController中,您将拥有params[:goal_id],现在您可以执行以下操作:

class TasksController
  before_action :load_goal

  def create
    @task = @goal.tasks.build(task_params)

    ...
  end

  private

  def load_goal
    @goal ||= Goal.where(id: params[:goal_id]).first
  end
end

重复其他级别的层次结构。

至于传播的user_id,你可以这样做:

class Task
  belongs_to :goal
  before_save :copy_user_id_from_parent

  def copy_user_id_from_parent
    self.user_id = goal.user_id
  end
end