プロジェクト、タスク、サブタスクに属するディスカッション(ポリモーフィック)があります。タスクはプロジェクトに属し、サブタスクはタスクに属します。
「シナプス」と呼ばれる結合テーブルを介してプロジェクトに接続しているユーザーがいます。Synapseモデルには、user_id、project_id、および:leaderと呼ばれるブールフィールドがあり、ユーザーがリーダー(別名admin)権限を持っているかどうかを通知します。
ユーザーがディスカッションを閉じる(終了する)には、現在のプロジェクトのリーダーであるか、そのディスカッションの作成者である必要があります。これが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
ユーザーモデルにはリーダー属性がないため、現在のユーザーとプロジェクトの間の対応するシナプスを見つける必要があります(リーダーブールフィールドがあり、ユーザーがディスカッションを閉じることができるかどうかを示します)。シナプスを見つけるためにapplication_controllerにあるメソッドは次のとおりです。
9 def find_synapse(user,project)
10 user.synapses.find_by_project_id(project)
11 end
シナプスを見つけるには、プロジェクトを見つける必要があります。これまでのところ、ディスカッションの親を見つけることができます。これは、プロジェクト、タスク、またはサブタスクモデルのいずれかです。
私の見方では、親を反復処理し、親がProjectクラス(forループ?)になったら停止する必要があります。これを行う方法?これはそれについて行くための最良の方法ですか?ところで、私はswitch-caseを使用してみました(@ parent.classがTaskの場合、これを実行し、classがProjectの場合、それを実行します)が、ハックのようで、とにかく動作するように管理できませんでした。