非常好的問題咀嚼。
首先,您必須將某個模型展示給另一個模型,其中有一種特定的角色(主要調查員),ProjectAssignment必須知道「特殊情況」角色。但!它應該是保持跟蹤特殊地位的項目中的角色,所以我的方法添加到ProjectRole型號:
ProjectRole < ActiveRecord::Base
def ispi?
self.name == 'Principal Investigator'
end
end
然後,你必須弄清楚如何遍歷所有project_asssignments,如果任何的決定他們是主要調查人員。您必須從project_assignment的實例訪問Class方法。
class ProjectAssignment < ActiveRecord::Base
validate :there_can_only_be_one_principal_investigator
def there_can_only_be_one_principal_investigator
error = false
self.class.where('project_id = ?',self.project_id).each do |p|
if p.project_role.ispi?
error = true
break
end
end
if error
#whatever
end
end
end
現在你必須改變你的協會,項目分配只能有一個角色,所以
class ProjectAssignment < ActiveRecord::Base
belongs_to :project
belongs_to :user
has_one :project_role
end
所以,現在你放心,你不能用project_role ==首席研究員添加一個項目分配,如果主體調查員已經存在該項目。
如何更新,您使用project_role == PI更新ProjectAssignment,並且已經有另一個ProjectAssignment和PI,驗證將會捕獲該更新。
現在你如何確保至少有一個PI?我認爲這意味着任何一個項目的FIRST ProjectAssignment必須是PI。這就是你必須有點冒險的地方,你必須直接在ProjectAssignment模型中公開有關ProjectRole模型的知識。
validate :there_must_be_at_least_one_principal_investigator
def there_must_be_at_least_one_principal_investigator
if self.class.where('project_id = ?', self.project_id).count() == 0 AND !self.project_role_id == 1
#error
end
end
我真的不喜歡這個解決方案,因爲事實PI角色的ID爲1(或不管它是什麼),是另一種型號的硬編碼!爲了使它不那麼令人反感的,你可以添加一個類的方法到ProjectRole模型
class ProjectRole < ActiveRecord::Base
def self.piid
1 # or whatever it is
end
end
那麼做到這一點:
def there_must_be_at_least_one_principal_investigator
if self.class.where('project_id = ?', self.project_id).count() == 0 AND ! self.project_role_id == ProjectRole.piid
#error
end
end
現在,你如何改變主要研究者?你必須單獨做這件事,即
class ProjectAssignmentController < ApplicationController
def change_pi
@proj_assignment1 = ProjectAssignment.find(params[:orig_pi_id])
@proj_assignment2 = ProjectAssignment.find(params[:new_pi_id])
@proj_assignment1.project_role_id = params[:new_role_for_orig_pi].to_i
@proj_assignment1.save :validate=>false # it's OK, you're taking care of it below
@proj_assignment2.project_role_id = ProjectRole.piid
@proj_assignment2.save
end
end
爲了澄清,您提到對於給定的項目,有一個projectassignment。如果是這種情況,那麼這不應該是一個has_one嗎?或者一個特定的項目可以有多個項目分配? – Nathan 2012-04-17 00:03:20
項目可以有多個項目分配,但只有一個項目分配,其中project_role是首席研究員。 – Dan 2012-04-17 00:17:01
我明白了。只是爲了挑戰你的想法,也許一個項目分配可以有很多用戶並且屬於一個項目。這樣,項目分配中的用戶就具有角色。否則,你只是將每個用戶包裝在他們自己的項目指派中 - 這真的是你想要的嗎? – Nathan 2012-04-17 00:32:10