0

我有一个公司模型:的Rails 3.2 + Postgres的:节省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法测得的。根据Rails documentation

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>] 

我敢肯定,我我错过了一些愚蠢的行为,但是我一直在嘲弄我的头一阵子,似乎无法理解我做错了什么。

感谢,

+0

如果你只是做:'company.jobs.create' – apneadiving

+0

@apneadiving完全相同的结果和输出 – gianpi

+0

这是逻辑,做:'company.jobs.select(&:坚持?)。大小' – apneadiving

回答

1

company.jobs实际上包含两份工作,但一个是坚持,而无效是没有的。

,你可以测试:

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

  • company.reload.jobs.size

+0

以上似乎工作,我会接受这个答案:) 但是:如何检查创建是否成功? (例如知道如何在控制器中响应) – gianpi

+0

'company.save'在你的代码中没有用处。检查'company.jobs.create({name:“”})的结果' – apneadiving

+0

这正是我所尝试的,问题是它仍然返回一个记录,它具有零属性,但它本身不是零。那是对的吗?似乎很奇怪,我必须去手动检查属性... – gianpi