Rails 3.2 + Postgres:即使验证失败,也会保存has_and_belongs_to_many

时间:2012-11-07 10:33:58

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.2 has-and-belongs-to-many

我有公司模特:

class Company < ActiveRecord::Base
    has_and_belongs_to_many :jobs
    validates :name, presence: true
end

和工作模式:

class Job < ActiveRecord::Base
    has_and_belongs_to_many :companies
    validates :name, presence: true
end

除了collection.create方法之外,一切正常。根据{{​​3}}:

  

collection.create方法返回关联类型的新对象。此对象将从传递的属性中实例化,将创建通过连接表的链接,并且一旦它通过关联模型上指定的所有验证,将保存关联的对象。

这对我来说似乎不正常:即使子对象无效(并且验证因无效模型未被保存而起作用),仍会创建关联。我创建了这个单元测试来解释我是如何尝试的:

test "add invalid job to company" do
  company = FactoryGirl.create(:company_with_job)

  # I also tried:
  # company.jobs << FactoryGirl.build(:job, name: "")
  company.jobs.create({name: ""})
  company.save
  assert_equal 1, company.jobs.size
end

大小是'2',如果我检查company.jobs,我得到这个:

[#<Job id: 1, name: "My Job 1", created_at: "2012-11-07 10:26:10", updated_at: "2012-11-07 10:26:10">, 
#<Job id: nil, name: "", created_at: nil, updated_at: nil>]

我确定我错过了一些愚蠢的东西,但我一直在敲打这个问题一段时间,似乎无法理解我做错了什么。

谢谢,

1 个答案:

答案 0 :(得分:1)

company.jobs实际上包含两个作业,但是一个作业是持久的,而不是作业。

你可以测试一下:

  • company.jobs.select(&:persisted?).size

  • company.reload.jobs.size