Rails:验证has_many关联中parent_id的存在

deb*_*deb 21 validation ruby-on-rails nested-forms models

我有一个项目资源,有很多任务.我想确保每个任务都有一个project_id添加validates_presence_of :project_id到任务模型.

但是,在使用任务创建新项目时,在记录保存之前,project_id将不可用,因此我无法使用validates_presence_of :project_id.

所以我的问题是,如何在任务模型中验证project_id的存在?我想确保每个任务都有父母.

...

class Project < ActiveRecord::Base

  has_many :tasks, :dependent => :destroy
  accepts_nested_attributes_for :tasks, :allow_destroy => true
Run Code Online (Sandbox Code Playgroud)

...

class Task < ActiveRecord::Base

 belongs_to :project
 validates_presence_of :project_id
Run Code Online (Sandbox Code Playgroud)

Jes*_*ott 17

你的代码有效:

  • 如果您验证了_presence_of:project,那么只要项目在那里,它就会验证.但是如果你的项目未保存,你仍然可以保存任务.
  • 如果您使用validates_presence_of:project_id,那么整数必须在那里,表示已保存的值.

这是证明重点的rSpec.如果验证:project_id,则无法保存任务而不保存项目.

class Task < ActiveRecord::Base
  belongs_to :project
end
Run Code Online (Sandbox Code Playgroud)

/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
Run Code Online (Sandbox Code Playgroud)


gam*_*mov 15

请看这里的最终答案:

class Project < ActiveRecord::Base

  has_many :tasks, :dependent => :destroy, :inverse_of => :project
  accepts_nested_attributes_for :tasks, :allow_destroy => true

class Task < ActiveRecord::Base

 belongs_to :project
 validates_presence_of :project
Run Code Online (Sandbox Code Playgroud)

如果你问我就不那么优雅......它应该透明地验证.