验证嵌套在动态生成的字段中的动态生成的字段

时间:2016-02-11 11:59:44

标签: ruby-on-rails validation ruby-on-rails-4 rails-activerecord cocoon-gem

我有三个模型ComapnyPersonRole公司has_many :people,人has_many :roles和公司has_many :roles, through: :people。在这里,它变得有趣:公司的人数和人的角色是使用cocoon分配的,这意味着我在一组动态生成的字段中有一组动态生成的字段。

我遇到的问题是验证公司的角色。例如,每家公司都需要一位总裁(role.role_name="President")所以我设置了以下内容:验证:

validate :final_incorporation

def company_validation
    errors.add(:company, "needs a president") if self.roles.where(role_name: "President").count==0
end

......它有效! ...有时。如果我注释掉验证并将公司与人员和角色保存到数据库,则将验证重新放入并保存。它通过验证。

但是,如果我添加一个人,然后扮演"总统"对于那个人并尝试通过验证提交,它没有通过。

我的猜测,虽然我不知道如何绕过它,但是cocoons为每个生成的字段分配临时id的方法是搞砸了验证中指定的关联。

从日志开始:

通过验证:

 ..."people_attributes"=>{"0"=>{"fname"=>"test", "lname"=>"", "roles_attributes"=>{"0"=>{"role_name"=>"President", "_destroy"=>"false", "id"=>"5"}, "1"=>{"role_name"=>"Treasurer", "_destroy"=>"false", "id"=>"6"}}}...

但这并不是:

..."people_attributes"=>{"1455189047186"=>{"fname"=>"test", "lname"=>"", "roles_attributes"=>{"1455189059602"=>{"role_name"=>"President", "_destroy"=>"false"}, "1455189066001"=>{"role_name"=>"Treasurer", "_destroy"=>"false"}}...

修改这也没有通过验证(先前已保存但添加了角色的人)

..."people_attributes"=>{"0"=>{"fname"=>"test", "lname"=>"", "roles_attributes"=>{"1455195637658"=>{"role_name"=>"President", "_destroy"=>"false"}, "1455195641046"=>{"role_name"=>"Treasurer", "_destroy"=>"false"}}...

如何解决这个问题的任何想法将不胜感激。提前谢谢!

1 个答案:

答案 0 :(得分:2)

def company_validation
    errors.add(:company, "needs a president") unless people.any?{|person| person.roles.any?{|role| role.role_name == "President" && !role.marked_for_destruction?}}
end