打电话有效吗?在新记录上,但忽略已建立关联的有效性

时间:2011-02-15 17:34:38

标签: ruby-on-rails validation

我有三个表:tasks,departments和department_tasks。我需要打电话“有效吗?”在新的任务对象上,但我想忽略任何“构建的”department_tasks的有效性。我们正在进行批量上传,因此我们加载所有内容或不加载任何内容。

当我们浏览我们正在阅读的Excel文件时,我们根据每行中的值构建新的“任务”。对于每一行,可能有一个相关的部门负责该任务;如果有,我们“建立”相关的department_task对象,如下所示:

new_task.department_tasks.build(:department_id => d.id)

在循环结束时,我们通过调用“valid?”来测试新“任务”对象的有效性。

new_task.valid?

如果任务有效,则进入“好”的堆;如果它很糟糕,它就会出现“糟糕”的情况。

问题是,我们没有保存任务,因此它没有:id。没有id,“built”department_task无效(:department_id和:task_id必须都存在)。

我需要知道我怎么称呼“有效”?或测试“new_task”对象的有效性,而无需将验证级联到“task_department”关联对象,该对象在保存任务之前无效。

2 个答案:

答案 0 :(得分:2)

您可以使用:if:unless

跳过个别验证
validates_presence_of :department_id,
  :unless => lambda { |record| record.new_record? }

<击>

如果我理解正确,你会有这样的事情:

class Task < ActiveRecord::Base
  has_many :department_tasks
  has_many :departments, :through => :department_tasks
  validates_associated :department_tasks
end

class DepartmentTask < ActiveRecord::Base
  belongs_to :task
  belongs_to :department
  validates_presence_of :department_id, :task_id
end

Task为新时,DepartmentTask中的关联验证失败,因为task_id为零。正确的吗?

我没有看到一个简单的方法。最明显的解决方案是删除validates_presence_of的{​​{1}}。如果您创建task_id的唯一方法是通过DepartmentTasks构建它们,则presence_of验证似乎是不必要的,因为Rails将在保存任务时始终添加Task model

另一种选择是将其包装在事务中,创建新任务(因此它具有ID),然后构建并验证DepartmentTask,如果无效则回滚。

答案 1 :(得分:0)

您应该为AR查询分配一个对象以检查其有效性,同时使用.new(:department_id => d.id)

myrecord = new_task.department_tasks.new(:department_id => d.id)
if myrecord.save!
 "good pile"
else
 "bad pile"
end