0

プロジェクト、タスク、サブタスクに属するディスカッション(ポリモーフィック)があります。タスクはプロジェクトに属し、サブタスクはタスクに属します。

「シナプス」と呼ばれる結合テーブルを介してプロジェクトに接続しているユーザーがいます。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の場合、それを実行します)が、ハックのようで、とにかく動作するように管理できませんでした。

4

2 に答える 2

1

switch-caseを機能させるには、実際にスイッチをオンにする必要があります@parent

case @parent
when Task
  ...
when Project
  ...
when Subtask
  ...
end
于 2012-05-29T17:28:31.687 に答える
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ステートメントとほとんど同じですが、継承システムを使用して切り替えを行います。

于 2012-05-29T21:02:37.653 に答える