Ruby on rails Rails:验证是否存在多个关联中的父\u id

Ruby on rails Rails:验证是否存在多个关联中的父\u id,ruby-on-rails,validation,models,nested-forms,Ruby On Rails,Validation,Models,Nested Forms,我有一个项目资源,它有许多任务。我希望通过向任务模型添加验证:project\u id的存在,确保每个任务都有一个project\u id 但是,在创建包含任务的新项目时,项目id在记录保存之前不可用,因此我无法使用验证:project\u id的存在 所以我的问题是,如何验证任务模型中是否存在项目id?我想确保每个任务都有一个父任务 class项目:销毁 接受:任务的\u嵌套\u属性,\u,:允许\u销毁=>true 类任务:project 接受:任务的\u嵌套\u属性,\u,:允许\u

我有一个项目资源,它有许多任务。我希望通过向任务模型添加
验证:project\u id
的存在,确保每个任务都有一个
project\u id

但是,在创建包含任务的新项目时,项目id在记录保存之前不可用,因此我无法使用
验证:project\u id的存在

所以我的问题是,如何验证任务模型中是否存在项目id?我想确保每个任务都有一个父任务

class项目:销毁
接受:任务的\u嵌套\u属性,\u,:允许\u销毁=>true

类任务
您的
项目
类必须定义

accepts_nested_attributes_for :tasks
有关如何制作表单的更多详细信息,请参阅


编辑:

在你的表格中,你应该有如下内容:

class Task < ActiveRecord::Base
  belongs_to :project
  validate_presence_of :project
end
\u form.html.erb

<% form_for @project do |f| %> 
    # project fields...
    <% f.fields_for :tasks do |builder| %>
        <%= render 'task_fields', :f => builder %>
    <% end %>
    <p><%= link_to_add_fields "Add task", f, :tasks %></p>
    <%= f.submit %>
<% end %>
<%= f.label :name, "Task name:" %>
<%= f.text_field :name %>
# task fields...
<%= link_to_remove_fields "Delete task", f, :tasks %>

link\u-to\u-add\u字段
link\u-to\u-remove\u字段
是应用程序\u-helper中定义的动态添加/删除字段的方法。

也许我不明白一些事情,但看起来你在试图欺骗rails。你为什么不这样做呢:

class Task < ActiveRecord::Base
  belongs_to :project
  validate_presence_of :project
end
类任务
看看这个:

我过去做过的一件事是添加:
验证:parent\u id,:on=>:update的存在。不是很好,但它有助于将网络收紧一点。

您的代码可以工作:

  • 如果您验证:project的存在,那么只要该项目存在,它就会验证。但是如果项目未保存,您仍然可以保存任务
  • 如果验证:project\u id的存在,则必须存在整数,表示保存的值
这是rSpec证明了这一点。如果验证:project\u id,则在不保存项目的情况下无法保存任务

class Task < ActiveRecord::Base
  belongs_to :project
end
有关最终答案,请参见:

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
class项目:destroy,:反向=>:project
接受:任务的\u嵌套\u属性,\u,:允许\u销毁=>true
类任务

如果你问我的话,就不那么优雅了。。。它应该透明地进行验证。

我认为您遇到的问题与我处理的问题相同。我有两个模型,Account和User,当创建帐户时,第一个用户是通过
@Account.users.build
创建的。用户模型有一个
验证:帐户的存在性
验证

为了让第一个用户通过验证,我在我的帐户模型中添加了以下代码:

  before_validation_on_create :initialize_users

  def initialize_users
    users.each { |u| u.account = self }
  end

实际上,你需要两个:

validates_presence_of project
validates_presence_of project_id
这样,如果数据库中只有2个有效项目,即项目id 99无效,则在以下任一情况下都不会保存任务:

task.project_id = 99
task.save

task.project = Project.new
task.save

我希望这对某人有所帮助。

hmn-好问题。因此,当它们一起保存时,它不会先创建项目,然后创建任务?嗯,它首先保存项目,然后结果id进入任务的
项目id
。这个问题对我来说没有多大意义。您希望某个任务属于某个项目,而不需要从某个项目开始。。。如何才能为不存在的东西获取id?创建项目时是否通过嵌套表单创建任务?我想将您的答案标记为正确,但复选标记不存在:/Thank deb!这是一个非常古老的问题:但是,你不能进行简单的关联验证的原因是,任务位于:字段中,它们嵌套在:项目表单中。保存时,项目id将不可用于验证,验证将失败。您可以通过简单地删除:project的验证来测试这一点。的:逆_确保关联在保存时保持得体。这完全忽略了创建操作。不好的。使用:反转以确保父对象在保存到嵌套字段时关联。
validates_presence_of project
validates_presence_of project_id
task.project_id = 99
task.save

task.project = Project.new
task.save