【发布时间】:2012-04-16 21:02:42
【问题描述】:
我有两个对象,Project 和 User,它们由一个名为 ProjectAssignment 的对象连接。 ProjectAssignments 对象有一个附加字段:project_role。型号如下所示。
class Project < ActiveRecord::Base
#relationships
has_many :project_assignments
has_many :users, :through => :project_assignments
end
class ProjectAssignment < ActiveRecord::Base
belongs_to :project
belongs_to :user
belongs_to :project_role
end
class User
has_many :project_assignments
has_many :projects, :through => :project_assignments
end
我必须验证对于给定的项目,在任何时候都只有一个 ProjectAssignment 的 project_role 为“Principal Investigator”。我有点不确定如何在 ProjectAssignment 模型中编写验证。如果我先取消设置当前 PI,那么 Principal Investigator 会少于 1 个,如果在取消设置另一个之前将用户设置为 Principal Investigator,则会有超过 1 个。
class ProjectAssignment
validates :allow_exactly_one_pi
def require_exactly_one_pi
if self.project_role.name == 'Principal Investigator' and other_princ_inv_exists
#more than one principle investigator set => error
elseif was_principle_investigator
#no principle investigator set => error
end
end
end
有什么建议应该如何处理?
【问题讨论】:
-
澄清一下,您提到对于给定的项目,有一个项目分配。如果是这种情况,那么这不应该是 has_one 吗?或者一个特定的项目可以有多个项目分配?
-
一个项目可以有多个项目分配,但只有一个 project_role 是主要调查员的项目分配。
-
我明白了。只是为了挑战你的想法,也许一个项目分配可以有很多用户并且属于一个项目。这样,项目分配中的用户就有了角色。否则,您只是将每个用户包装在他们自己的项目分配中——这真的是您想要的吗?
-
但是每个用户可以有多个项目,他们可以有不同的角色。我认为这不能在您描述的模型中表示。
-
当然,一个用户可以属于多个 PA。一个项目可以有多个 PA(如果您愿意,也可以有一个 PA)。所以现在只需验证一个 PA 只能有 1 个角色为 PI 的用户。
标签: ruby-on-rails validation model