Rails:验证has_many关联中parent_id的存在 [英] Rails: validate presence of parent_id in has_many association
问题描述
我有一个项目资源,其中有很多任务.我想通过将validates_presence_of :project_id
添加到任务模型来确保每个任务都有一个project_id
.
I have a projects resource that has many tasks. I want to ensure that every task has a project_id
by adding validates_presence_of :project_id
to the tasks model.
但是,当创建带有任务的新项目时,直到记录保存,project_id才可用,因此我不能使用validates_presence_of :project_id
.
However, when creating a new project with tasks, the project_id won't be available until the record saves, therefore I can't use validates_presence_of :project_id
.
所以我的问题是,如何验证任务模型中project_id的存在?我想确保每个任务都有父母.
So my question is, how do I validate presence of project_id in the task model? I want to ensure every task has a parent.
...
class Project < ActiveRecord::Base
has_many :tasks, :dependent => :destroy
accepts_nested_attributes_for :tasks, :allow_destroy => true
...
class Task < ActiveRecord::Base
belongs_to :project
validates_presence_of :project_id
推荐答案
您的代码有效:
- 如果您验证了:projects_presence_of,那么只要该项目存在,它就会进行验证.但是,如果您的项目未保存,您仍然可以保存任务.
- 如果您通过validates_presence_of:project_id,则该整数必须存在,表示已保存的值.
这里的rSpec证明了这一点.如果您验证:project_id,则必须保存项目才能保存任务.
Here's rSpec that proves the point. If you validate :project_id, you can't save a task without saving the Project.
class Task < ActiveRecord::Base
belongs_to :project
end
/specs/model_specs/task_spec.rb
/specs/model_specs/task_spec.rb
require File.dirname(__FILE__) + '/../spec_helper'
describe Task do
before(:each) do
@project = Project.new
end
it "should require a project_id, not just a project object" do
task = Task.new
task.project = @project
Task.instance_eval("validates_presence_of :project_id")
task.valid?.should == false
end
it "should not be valid without a project" do
task = Task.new
task.project = @project
Task.instance_eval("validates_presence_of :project")
task.valid?.should == false
task.save.should == false
end
end
这篇关于Rails:验证has_many关联中parent_id的存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!