Ruby on rails 带有accept_嵌套属性的验证

Ruby on rails 带有accept_嵌套属性的验证,ruby-on-rails,validation,nested-attributes,one-to-one,Ruby On Rails,Validation,Nested Attributes,One To One,我的rails应用程序的一些代码有问题,想象一下以下场景: user.rb 此时,用户验证是正常的,它只运行来自用户模型的验证,但是如果由于某种原因加载了与参与者的关联,那么有效吗?方法将运行来自用户和参与者的验证,因为用户是用户模型的实例,所以IMHO是错误的 user.participant Participant Load (0.3ms) SELECT "participants".* FROM "participants" WHERE "participants"."user_id

我的rails应用程序的一些代码有问题,想象一下以下场景:

user.rb

此时,用户验证是正常的,它只运行来自用户模型的验证,但是如果由于某种原因加载了与参与者的关联,那么有效吗?方法将运行来自用户和参与者的验证,因为用户是用户模型的实例,所以IMHO是错误的

user.participant  
Participant Load (0.3ms)  SELECT "participants".* FROM "participants" WHERE "participants"."user_id" = ? LIMIT 1  [["user_id", 1]]  
 => #<Participant id: 1, user_id: 1, phone_number: "", created_at: "2015-01-13 18:15:34", updated_at: "2015-01-13 18:48:27">
user.valid?  
#=>false
user.errors.full_messages  
#=> ["Participant phone number can't be blank"]
如果我正在更新参与者模型中的某些内容,我会同意此验证,但我没有。这是一个bug还是有什么方法可以跳过相关的验证


感谢Rails中的嵌套属性将行为传递给父子。如果你打电话,有效吗?在父级上,它将检查所有子级的验证。这是预期的结构,这样可以确保关联的模型有效,因为您要求它有效


我要问的问题是,如果要跳过验证,为什么要在参与者模型上验证phone_number属性?您需要删除对电话号码的验证,或者确保存在电话号码。我认为您需要重新评估模型的结构,并考虑到这一点进行验证。

谢谢您的评论,模型假设所有业务逻辑都是孤立的,我有电话号码的验证,因为这是参与者模型应该工作的方式。不过,这是一个例子,我在真实模型中有更多的验证。我明白你的意思,但我觉得有点不对劲,因为我没有修改参与者模型中的任何内容,也许有另一种方法可以做到这一点。嗨,Richard,模型的逻辑确实与特定模型隔离,这是真的。但是,当您将参与者模型嵌套在用户模型下时,实际上您正在两个模型上执行一个操作,从而在这两个模型上调用验证。下面是嵌套关联如何工作的另一个示例:当您在关联的参与者模型上执行User.save时,它将执行.save以保存嵌套模型的属性。同样的逻辑也适用于运行。有效吗?它将运行。有效吗?在父对象和嵌套的子对象上,因为这是嵌套模型时所期望的结果。正确,但问题是该模型有效吗?仅当加载了accepts_nested_attributes_for中使用的关系时,方法才会在模型User和Participant中运行。在上面的示例中,您正在测试的用户id=>1具有关联的Participant Participant_id=>1,因此您加载了它,因此在运行时它会加载该用户的参与者模型验证user.valid?并且验证失败,因为关联的参与者没有有效的电话号码。请查看此线程。。。也许它对你有用。
class Participant < ActiveRecord::Base  
  belongs_to :user
  validates_presence_of :phone_number
end
user = User.first
user.valid?
#=> true
user.participant  
Participant Load (0.3ms)  SELECT "participants".* FROM "participants" WHERE "participants"."user_id" = ? LIMIT 1  [["user_id", 1]]  
 => #<Participant id: 1, user_id: 1, phone_number: "", created_at: "2015-01-13 18:15:34", updated_at: "2015-01-13 18:48:27">
user.valid?  
#=>false
user.errors.full_messages  
#=> ["Participant phone number can't be blank"]