我有三个表: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”关联对象,该对象在保存任务之前无效。
答案 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