我有Project
模型和User
模型。项目必须具有客户端(用户类),因此Project
模型具有client_id
外键。
User
模型具有type
属性,如果用户是客户端,则会包含3
。
我想验证,当项目分配给客户时,@user.type
为3
。
Project.rb
validates :client_id, presence: true, #@user.type must be 3
belongs_to :client, :class_name => User, :foreign_key => :client_id
User.rb
#constants
TYPES = {
:manager => 1,
:contractor => 2,
:client => 3
}
不确定如何进行验证。我阅读了有关验证的rails指南,但似乎仍无法获得解决方案。有什么想法吗?
答案 0 :(得分:5)
使用inclusion
验证助手。 Docs here
以下是文档
的快速示例class Coffee < ActiveRecord::Base
validates :size, :inclusion => { :in => %w(small medium large),
:message => "%{value} is not a valid size" }
end
<小时/> 编辑:
好的,我明白你的意思了。不要为此使用验证助手,请手动执行。
# somewhere in your model (don't be tempted to put this in your controller)
def assigning_client
if @user.type == 3
# do the assignment
else
errors.add(:base, :message => "User must be a client")
end
end
只要您使用强制验证的爆炸版本save!
,该错误就会阻止保存信息。
答案 1 :(得分:1)
这里只是一个指针。不要在activerecord模型中使用名为type的属性。它与rails使用STI(单表继承)的方式冲突,因为它使用type属性来确定类的子类化时的类型