通过递归迭代Rails关系来查找特定的父类

时间:2012-05-29 17:00:16

标签: ruby-on-rails ruby

我有属于项目,任务和子任务的讨论(多态)。任务属于“项目”和“任务的子任务”。

我让用户通过称为“synapses”的连接表连接到Projects。 Synapse模型具有user_id,project_id和boolean字段,如果用户具有领导者(AKA管理员)权限,则称为:leader wich。

对于用户关闭(完成)讨论,他需要成为当前项目的领导者或者需要成为该讨论的创建者。这是Discussions控制器中的'finish'方法:

 33   def finish
 34     if current_user.leader? || current_user.discussions.include?(@discussion)
 35       @discussion.update_attribute(:finished, true)
 36       redirect_to polymorphic_path([@parent, Discussion])
 37       flash[:notice] = "Discussion '#{@discussion.name}' finished"
 38     else
 39       flash[:alert] = 'You must be an admin to do that'
 40     end
 41   end

由于用户模型本身没有leader属性,我需要在当前用户和项目之间找到相应的突触(确实有领导者布尔字段,显示用户是否可以关闭讨论)。这是我在application_controller中找到synapse的方法:

  9   def find_synapse(user,project)  
 10     user.synapses.find_by_project_id(project)
 11   end

要找到突触,我需要找到项目。到目前为止,我可以找到讨论的父级,可以是项目,任务或子任务模型。

我看到它的方式,我需要遍历父母而不是在父类属于类Project(for循环?)时停止。这该怎么做?这是最好的方式吗?顺便说一句,我尝试使用switch-case(当@ parent.class是Task时,执行此操作,当类是Project时,这样做),但似乎是hackish并且我没有管理它无论如何工作。

2 个答案:

答案 0 :(得分:1)

如果你想让switch-case工作,它实际上必须打开@parent

case @parent
when Task
  ...
when Project
  ...
when Subtask
  ...
end

答案 1 :(得分:1)

如果在项目,任务,子任务上定义方法owning_product

class Project
  def owning_project
    self
  end
end

class Task
  def owning_project
    project
  end
end

class Subtask
  def owning_project
    task.owning_project
  end
end

然后,您可以在讨论的父母上致电owning_project,然后返回相关项目。在某种程度上,这与您的case语句几乎相同,但使用继承系统为您进行切换。