我有属于项目,任务和子任务的讨论(多态)。任务属于“项目”和“任务的子任务”。
我让用户通过称为“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并且我没有管理它无论如何工作。
答案 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语句几乎相同,但使用继承系统为您进行切换。