播种未通过嵌套表验证(validates_presence_of)

时间:2015-06-23 04:25:46

标签: ruby-on-rails ruby validation ruby-on-rails-4 associations

组织模型与用户模型具有1:多的关联。 我的用户模型文件中有以下验证:

belongs_to :organization
validates_presence_of :organization_id, :unless => 'usertype==1'

如果usertype为1,则表示用户没有与之关联的组织。对于不同的usertype,organization_id的存在应该是强制性的。

组织模型包括:

has_many :users
accepts_nested_attributes_for :users, :reject_if => :all_blank, :allow_destroy => true

我的种子文件使用嵌套,包括:

Organization.create!(name: "Fictious business",
                     address: Faker::Address.street_address,
                     city: Faker::Address.city,
  users_attributes: [email: "helpst@example.com",
                     username: "helpyzghtst", 
                     usertype: 2,
                     password: "foobar", 
                     password_confirmation: "foobar"])

播种时会产生以下错误。从模型中删除验证解决了它,但我不想这样做。我怎么解决这个问题?

  

验证失败:用户组织不能为空

2 个答案:

答案 0 :(得分:1)

发现这个:https://groups.google.com/forum/#!topic/comp.softsys.matlab/p3NX0fI6u90(最后一章)

{{1}}

文档不太清楚,但我认为值得一试。请参阅此Validating nested association in Rails,声明关联监视将使用内存中的对象,而不是从数据库中获取它们,这将是您所需要的。

修改

删除了组织类的inverse_of。

答案 1 :(得分:0)

organization = Organization.create! name: "Fictious business",
                                    address: Faker::Address.street_address,
                                    city: Faker::Address.city

User.create! email: "helpst@example.com",
             username: "helpyzghtst", 
             usertype: 2,
             password: "foobar", 
             password_confirmation: "foobar"
             organization: organization

更新

使用嵌套属性调用Organization.create!时,rails首先创建Organization而不进行任何验证,然后构建 User,对其执行所有验证,然后将其保存到数据库(如果全部为绿色),就像在没有爆炸的情况下调用create一样。